从零创建项目实践

背景

大帅MarkZhai的从零系列火遍大江南北,奈何大帅最近要做爸爸了,忙得没有时间出demo,文章中一些细节部分没有上代码,一些粉丝肯定看的不知所措,所以做小弟的就替大哥为大家整理了个demo。接下来会结合大帅的理论为大家讲述一下如何实践,在本文的最后会附上Demo地址。

关于本实践的说明

本实践是为了方便,调用github的api,抓取了我们moduth组的repo

热身运动

先要补充一点知识的细节才能更加好跟上司机的车

整体结构

参考:从零开始的Android新项目1 - 架构搭建篇

还是直接看IDEA比较直接吧,SDK中就是放一些library的地方。在实际项目中,我们确实做到了“避免为了模式而模式所导致的开发压力”,用了MVPVM,也不是所有的地方都有些P,只在复杂的地方用P层去做解耦。

项目结构

Gradle篇

参考:从零开始的Android新项目2 - Gradle篇
因为Gradle依赖在这篇已经写的很详细,大家可以在demo中细看。

MVPVM

Model:
在domain->model->repos->ReposEntity
这就是接口返回格式的Entity,用GsonFormat直接生成。

View:
因为获取的是个列表,所以这里的view就是Activity、RecyclerView,通过Presenter和ViewModel通信。

Presenter:
在app->presenter->ReposListPresenter
项目中的Presenter使用了泛型,关于这个可以看一下
http://hannesdorfmann.com/android/mosby

ViewModel:
在app->model>ReposModel,用于view需要显示的一些properties,至于从Entity -> ViewModel ,这里单独创建了一个类,用于映射:
Mapper
这里用到了Dagger的一些东西,后面会介绍到。
ViewModel和View的显示数据交给了DataBinding,有条件的同学可以看看官方Databinding视频

有些比较简单的业务不需要都创建Presenter,反而把简单的东西写复杂了。

项目实践

Dagger

为什么要在项目实践的一开始讲Dagger呢,因为贯穿整个项目的就是Dagger了,如果Dagger不懂的话,那么你会发现接下来看起来就很难受,当然Dagger的门槛是有的,但是程序员就应该迎刃而上。

简单的说一下:你可以把Dagger理解成,你不需要手动去调用构造函数,如果你在别的地方生成过一些构造函数需要的参数,那么你就直接使用@Inject就可以了。当然实际上依赖注入这个概念就是比较抽象的,如果大家实在是搞不懂Dagger,可以把项目中的Dagger去掉。这并不影响项目结构。

Repository层

大部分App都需要去服务器获取数据,关于网络这块,我们用的是Retrofit+Rxjava,至于如何使用网上文章很多,就不在这里一一赘述了,而Repository层就是为了隐藏数据是从网络取还是数据库取,只要你伸手要,那我就给你便是了,你不需要关心数据哪里来。在demo中只做了对网络的获取,domain中的Repository实际上是一个interface。
ReposRepository
真正的实现在data层的repository,是一个单例:
ReposDataRepository
因为是Github接口原因,没有在return的时候再加一层,其实是应该再加一层统一解析的处理:

1
2
3
4
5
6
7
@Override
public Observable<YourResponse> getReposList(String user) {
return RepositoryUtils.
extractData(mReposApi.login(user),
YourResponse.class);
}

至于RepositoryUtils的代码:
RepositoryUtils
为了能在解析的时候处理是否成功的字段,或者需要抛出自己的Exception。

Interactor

咦,这是啥?是不是之前看大帅的文章中没提到,哈哈哈哈,他太忙了,就漏掉了。在这里多了一层interactor,主要是Rxjava的subscriber订阅,subscribeOn以及observerOn需要分配线程,都在这一层统一封装了。
UseCase
这里泛型传入的就是解析需要返回的类型,子类可以设置参数调用
GetRepo
这个interactor是由Presenter去调用的不需要关心repository的具体实现,只需要调用这个就可以了,达到了解耦的目的。

Presenter

控制和View交互,处理一些监听,具体的实现要看业务需求了。
Presenter

initialize方法是被Activity、Fragment调用,用于获取数据。
这里的detachView当Activity或Fragment调用onDestory的时候 而被调用。getView.userList,则是在View层复写,用来通知view我拿到数据了,之类的操作。

ViewDataBinding

关于这个章节,我就先放一下,因为准备放在下一篇文章中细讲。
因为Databinding会有很多部分替代了Presenter。

Component

Component是Dagger中的组件,全局会有一个ApplicationComponent,在这里提供了全局的一些设置,以及所有Repository,至于这些是如何提供的,则写在了Module中。在这里举例一下ApplicationComponent
ApplicationComponent

ApplicationModule

然后会有一些业务的Component,全局都dependencies ApplicationComponent,在业务Component下,会声明哪些Activity或者Fragment去Inject,并在Module里写一些需要用到的东西,比如UseCase等。

结语

其实概念性的东西太多,所以可能不是很好理解,需要同学们动手去试一试,用过了才知道好不好,而且每个人的理念和观点也不同,总会有争议,所以还是得理解思想,而不是照搬,希望大家能通过本文可以更好的理解这个结构。

讲了这么多东西,肯定会有些同学一脸懵逼的,这不怪你们,是我写的不太好=。=!所以附上Demo地址:Demo

最近大帅的开了个QQ实践群(568863373),欢迎大家一起讨论,也可以关注我们的公众号:魔都三帅

公众号

Abner_泥阿布 wechat
欢迎您扫一扫上面的微信公众号,订阅我们的公众号!
或者欢迎加入QQ群:568863373。


如果你觉得这篇文章对你有帮助,请点击下面的分享链接,你还可以选择扫描二维码进行打赏!

我的Github

我的新浪微博