热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

MVP架构实现的Github客户端(2搭建项目框架)

系列文章:1-准备工作2-搭建项目框架3-功能实现4-加入网络缓存请先阅读MVP架构实现的Github客户端(1-准备工作).本文承接上文,主要介绍项目框架搭建.废话少说,放码过来

系列文章:
1-准备工作
2-搭建项目框架
3-功能实现
4-加入网络缓存

请先阅读MVP架构实现的Github客户端(1-准备工作). 本文承接上文, 主要介绍项目框架搭建.

废话少说, 放码过来

1, 提取一个mvp模块

提取MVP中View/Presenter相关接口到一个独立的mvp模块(可复用):

包结构

《MVP架构实现的Github客户端(2-搭建项目框架)》 mvp_package_structure

类图

《MVP架构实现的Github客户端(2-搭建项目框架)》 mvp_class_diagram

简单说明

一个MvpView接口来约束View组件:

public interface MvpView {
}

MvpPresenter接口中关联MvpView:

public interface MvpPresenter {
/**
* Set or attach the view to this presenter
*/
@UiThread
void attachView(V view);
/**
* Will be called if the view has been destroyed. Typically this method will be invoked from
* Activity.detachView() or Fragment.onDestroyView()
*/
@UiThread
void detachView();
}

另外, 由于现在App的内容展示大部分是基于网络数据, 在此扩展了一个通用的LceView, Lce取Loading, Content, Error之意:

public interface LceView extends MvpView {
@UiThread
public void showLoading();
@UiThread
public void dismissLoading();
@UiThread
public void showContent(M data);
@UiThread
public void showError(Throwable e);
}

2, 搭建app框架

包结构

app框架方面, 个人主张是先基于MVP架构分包 然后根据业务功能划分模块的, 如下:

《MVP架构实现的Github客户端(2-搭建项目框架)》 app_package_structure

其中:

  • common

    • 包含util, config, constant等通用包和类.
  • data

    • 包含model, api, db, pref, 网络接口实现等.
    • 其中对外公开一个DataRepository提供业务接口相关数据.
  • di

    • 依赖注入相关的类.
    • 根据dagger2的风格, 一般有module和component模块.
  • presenter

    • 里面根据业务模块划分.
  • ui

    • 包含UI层的所有东东. activity, fragment, widget, dialog, adapter等, 根据需求不同分包方式有出入.

层次结构

层次结构相对与业务需求而言, 例如账户相关的登录注册, repo模块相关的repo列表, 详情等…
大体上每个业务模块都会由以下几个部分构成, 整体的项目层次也是如此:

《MVP架构实现的Github客户端(2-搭建项目框架)》 mvp_layer

3, 完善基础工程

根据上述两步, 一个项目的基本架构已经完成, 但是并不完整, 我们还需要添加一些通用类, 基础类来完善下. 其实这些基类也相当于是一个编码规范, 特别是多人合作项目中, 提前根据项目需求写一些通用类, 工具类, 基类等, 能够避免后续大家编码上各自一套. 所以个人认为这些类的编写也属于搭建框架的一部分.

添加相关Base类

为了便于统一处理, 惯例, 我们需要为Activity, Fragment创建一个BaseActivity, BaseFragment. 可以在ui包里创建一个base子包放置.

《MVP架构实现的Github客户端(2-搭建项目框架)》 base_class

这个基类好处多多, 例如我们对界面的统一处理, 生命周期的日志打印, 添加统计工具等, 都能很方便的再基类里面处理.

封装相关工具类

如上文所说, 个人习惯对第三方开源库再做一层封装, 以便后续灵活替换.
使用过程中, 也只需调用封装后的接口即可, 无需关注具体的依赖包. 也利于大家协作统一.
例如:

  1. Logger封装
    创建一个AppLog类来包装Logger:

public class AppLog {
private static final String TAG = "GithubApp";
/**
* initialize the logger.
*/
public static void init() {
Logger.init(TAG);
}
/**
* log.i
* @param msg
*/
public static void i(String msg) {
if (BuildConfig.DEBUG) {
Logger.i(msg);
}
}
/**
* log.d
* @param msg
*/
public static void d(String msg) {
if (BuildConfig.DEBUG) {
Logger.d(msg);
}
}
/**
* log.w
* @param msg
*/
public static void w(String msg) {
if (BuildConfig.DEBUG) {
Logger.w(msg);
}
}
/**
* log.e
* @param msg
*/
public static void e(String msg) {
Logger.e(msg);
}
}

  1. 图片加载库封装
    封装一个ImageLoader工具类来对外提供接口加载图片:

public class ImageLoader {
/**
* Load image from source and set it into the imageView. Use Glide now.
* @param context context.
* @param source could be Uri/String/File/ResourceId.
* @param view the imageView.
*/
public static void load(Context context, Object source, ImageView view) {
Glide.with(context)
.load(source)
.centerCrop()
.into(view);
}
}

Dagger相关基础类

因为我们使用的Dagger2来做依赖注入, 因为Activity和Application的Context是比较常用的, 我们会构建Activity, Application相关的component/module来提供对应的Context.
具体代码参看github工程源码.

4, 整体结构

假设我们的产品需要是迭代式的, 至此, 我们的基础框架已经差不多了(不建议做过多过早设计).
回顾下, 大体结构现在基本如下:

mvp

《MVP架构实现的Github客户端(2-搭建项目框架)》 mvp

app

《MVP架构实现的Github客户端(2-搭建项目框架)》 app

具体代码请参看https://github.com/mingjunli/GithubApp

目前代码只是一个基础的框架, 心急的同学可以参看这个工程, 架构类似. 一个简单的新闻客户端, 用来做MVP demo的.


推荐阅读
  • 云原生边缘计算之KubeEdge简介及功能特点
    本文介绍了云原生边缘计算中的KubeEdge系统,该系统是一个开源系统,用于将容器化应用程序编排功能扩展到Edge的主机。它基于Kubernetes构建,并为网络应用程序提供基础架构支持。同时,KubeEdge具有离线模式、基于Kubernetes的节点、群集、应用程序和设备管理、资源优化等特点。此外,KubeEdge还支持跨平台工作,在私有、公共和混合云中都可以运行。同时,KubeEdge还提供数据管理和数据分析管道引擎的支持。最后,本文还介绍了KubeEdge系统生成证书的方法。 ... [详细]
  • 自动轮播,反转播放的ViewPagerAdapter的使用方法和效果展示
    本文介绍了如何使用自动轮播、反转播放的ViewPagerAdapter,并展示了其效果。该ViewPagerAdapter支持无限循环、触摸暂停、切换缩放等功能。同时提供了使用GIF.gif的示例和github地址。通过LoopFragmentPagerAdapter类的getActualCount、getActualItem和getActualPagerTitle方法可以实现自定义的循环效果和标题展示。 ... [详细]
  • 本文介绍了在go语言中利用(*interface{})(nil)传递参数类型的原理及应用。通过分析Martini框架中的injector类型的声明,解释了values映射表的作用以及parent Injector的含义。同时,讨论了该技术在实际开发中的应用场景。 ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • Google Play推出全新的应用内评价API,帮助开发者获取更多优质用户反馈。用户每天在Google Play上发表数百万条评论,这有助于开发者了解用户喜好和改进需求。开发者可以选择在适当的时间请求用户撰写评论,以获得全面而有用的反馈。全新应用内评价功能让用户无需返回应用详情页面即可发表评论,提升用户体验。 ... [详细]
  • 深度学习中的Vision Transformer (ViT)详解
    本文详细介绍了深度学习中的Vision Transformer (ViT)方法。首先介绍了相关工作和ViT的基本原理,包括图像块嵌入、可学习的嵌入、位置嵌入和Transformer编码器等。接着讨论了ViT的张量维度变化、归纳偏置与混合架构、微调及更高分辨率等方面。最后给出了实验结果和相关代码的链接。本文的研究表明,对于CV任务,直接应用纯Transformer架构于图像块序列是可行的,无需依赖于卷积网络。 ... [详细]
  • 海马s5近光灯能否直接更换为H7?
    本文主要介绍了海马s5车型的近光灯是否可以直接更换为H7灯泡,并提供了完整的教程下载地址。此外,还详细讲解了DSP功能函数中的数据拷贝、数据填充和浮点数转换为定点数的相关内容。 ... [详细]
  • 本文介绍了一种图的存储和遍历方法——链式前向星法,该方法在存储带边权的图时时间效率比vector略高且节省空间。然而,链式前向星法存图的最大问题是对一个点的出边进行排序去重不容易,但在平行边无所谓的情况下选择这个方法是非常明智的。文章还提及了图中搜索树的父子关系一般不是很重要,同时给出了相应的代码示例。 ... [详细]
  • 安卓ndk开发!高级Android晋升之View渲染机制,附答案
    缘起深圳市腾讯计算机系统有限公司成立于1998年11月,是中国最大的互联网综合服务提供商之一,也是中国服务用户最多的互联网企业之一。腾讯业务多元化& ... [详细]
  • #前言AndroidArchitectureComponents是谷歌在GoogleIO2017发布的。官方的描述:https:developer.android.google.c ... [详细]
  • 本文整理了Java中javax.lang.model.util.Types.getNullType()方法的一些代码示例,展示了Types.getNullT ... [详细]
  • 开发笔记:Dagger2 探索记3——两大进阶组件
        今天要讲的时@Scope这个组件。为什么说它是进阶组件,就是因为它基本上没作用,但在理解了基本组件之后又必须用到。 ... [详细]
  • 1.在gradle中添加依赖在主项目的build.gradle中添加Dagger2库的依赖dependencies{compilecom.google.dagger:dagger: ... [详细]
  • android 自定义模板下载,android studio 自定义模板
    由于项目用上了mvp架构,基本上一个页面就至少需要新创建6个类,分别是modelviewpresenter的接口以及其对应的实现类,再加上使用dagger的话就要更多了,所以这时候 ... [详细]
author-avatar
夜幕下的猫眼_398
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有