[Android开源]一套快速高效的开发框架EasyAndroid

类库介绍 EasyAndroidjava

如今Android的框架不少,第三方库也不少,当作一个项目的时候,会考虑怎么整合那么多的资源,以达到复用快速开发。android

今天要说的这个框架就是整合了主流Retrofit2网络层封装、Fresco图片加载、都使用OKHTTP3进行网络处理、使用MVP架构,来快速灵活开发复用咱们的项目。git

框架说明github

Retrofit2数据库

为何要使用它呢?咱们来想一想若是不使用它的话,咱们直接操做OKHTTP3的网络请求,还须要作哪些操做?当发送请求的时候,来封装要以get或者post方式发送,而后回来了GJSON解析成咱们须要的实体对象,还要看返回的数据相应码等等,来正确解析咱们的数据,那么Retrofit2就是为了高效解决这些事情的,固然Retrofit2不止这些功能,具体你们可看API。api

Fresco缓存

比较了一些主流的图片加载以及各类对比,Fresco算是综合比较好的,支持较多,更新及时。网络

OKHTTP3架构

不解释了 你们都在用app

Other类库

都是一些用的比较多的,Cookie自动管理、View注入Butterknife、以及RecycleView下拉刷新BaseRecyclerViewAdapterHelper、Utilcode工具库、Logger日志库 你们之前没用过的能够关注下 都很好用 灵活

MVP 架构思想

下面重点说一下MVP的Clean模式,如今MVP很火,大行其道,不搞一套MVP架构都感受缺乏点啥,哈哈,为何呢?MVP难道就是简单的加了一个Presenter层吗?显然不是,它是一种思想,若是简单的一个应用每一个Activity类中500行搞定,还须要MVP吗?我以为就不适合了。越大型的APP、越复杂的APP才会让你以为MVP的好。怎么作到让代码各司其职。

MVP Clean模式



上面这张图就是Clean的架构,为何须要Clean架构呢,咱们来想一想,咱们把业务逻辑部分都放到了Presenter层,若是这个页面作的逻辑不少,十来个业务操做(请求数据,数据库操做等),这样Presenter也会很是庞大,既然臃肿,咱们继续抽象,在Presenter层下面在加一层Use Cases Domain层,专门处理增删改查等任务岂不业务更清晰明了,Presenter只须要执行相关UseCases任务,操做完回调处理就OK了。

MVP Dagger2模式


Dagger2又是个什么东东?我想说你写了Activity或者Fragment依赖Prensenter,而后呢Clean模式又让Presenter依赖UseCases,每次new一个实例进去,而后传递啊等等,想一想都累,那么Dagger2能够帮你生成这些实例,你依赖啥,我注入啥,这就是它的精髓依赖注入,不止这些,第三方库,以及其它的提供者均可以进行注入,只要你须要,还有咱们的Presenter对象的实例生命周期你怎么管理,UseCases层的对象呢,这一切Dagger2能够帮你作到,能够自定义Scopes,java自动帮你处理

还有一点差点忘了为何叫Dagger2,版本号2呢,由于它2,哈哈,由于Dagger1使用的是运行时反射机制,这样会影响性能,Dagger2使用编译时自动生成对应代码,直接运行性能不会受到影响。

怎么使用这个库

DEMO代码结构图

com.wjj.easy.easyandroidHelper 

common 

base 

BaseActivity

BaseFragment

BasePresenter

BaseView

SimpleActivity

SimpleFragment

di 

ActivityCommonComponent

AppCommonComponent

AppCommonModule

FragmentCommonComponent

net 

ApiService

AppHttp

model

module 

login 

LoginActivity

LoginContract

LoginPresenter

utils

AppApplication

在app module里面common包里面包含了业务逻辑层须要实现的代码演示,你们拷贝到本身项目中就好了,里面的base包包含基本的Activity、Fragment封装,咱们用的时候只要在继承的时候指定须要的Presenter,会自动帮咱们生成这个Presenter实例。

publicclassLoginActivityextendsBaseActivity

1

di包,就是咱们的dagger2使用包了,在这里面提供咱们的实例,生成咱们通用的注入器,不懂没关系,不要关心,拿过去用就好了,只用来作一些presenter、task、全局实例的注入、其它大可没必要用这个,原本是为了增长代码健壮性、提升效率的不能本末倒置了。要你作的就是在ActivityCommonComponent或者FragmentCommonComponent中注入咱们要添加的Activity或者Fragment就好了。

/** * Activity注入器 * @authorwujiajun */@ActivityScope@Component(dependencies = AppCommonComponent.class, modules = {ActivityModule.class})publicinterfaceActivityCommonComponentextendsActivityComponent{voidinject(LoginActivity activity);voidinject(MainActivity activity);}

1

2

3

4

5

6

7

8

9

10

11

12

net就是Retrofit2封装 ApiService包含所有的接口请求,包括请求参数、请求方式、地址、文件上传、下载,请求格式,均可以注解操做。

/**

    * 获取注册验证码

    */@FormUrlEncoded@POST(HOST +"app/sendSMS.do")    Call getVerifyCode(@Field("username") String username,@Field("password") String pwd);

1

2

3

4

5

6

AppHttp就是对咱们的接口进行调用处理

publicvoidgetVerifyCode(String username, String pwd,finalHttp.HttpCallback callback) {        Call call = apiService.getVerifyCode(username, pwd);        call.enqueue(newHttp.CallbackDefault(callback));        call.request();    }

1

2

3

4

5

module里面拿login来举例吧 LoginActivity对LoginPresenter的依赖,以及LoginPresenter对LoginContract.View的依赖,都在类继承的时候指定就行了,会自动帮你生成,不须要传递。

/** * 登陆Activity * * @authorwujiajun */publicclassLoginActivityextendsBaseActivityimplementsLoginContract.View{@BindView(R.id.set_user_name)    EditText setUserName;@BindView(R.id.set_pwd)    EditText setPwd;@BindView(R.id.set_verify_code)    EditText setVerifyCode;@BindView(R.id.get_verify_code)    TextView getVerifyCode;@BindView(R.id.tv_login)    TextView tvLogin;@BindView(R.id.tool_bar)    Toolbar toolbar;@OverrideprotectedvoidinitInject() {        getActivityComponent().inject(this);    }@OverrideprotectedvoidinitEventAndData() {        toolbar.setLogo(R.mipmap.icon_app);        toolbar.setTitle(R.string.app_name);        toolbar.setTitleTextColor(ContextCompat.getColor(this, R.color.white));        toolbar.setTitleMarginStart(getResources().getDimensionPixelSize(R.dimen.padding_size_30));        setSupportActionBar(toolbar);    }@OverrideprotectedintgetContentView() {returnR.layout.activity_login;    }@OnClick({R.id.get_verify_code, R.id.tv_login})publicvoidonClick(View view) {switch(view.getId()) {caseR.id.get_verify_code:                getPresenter().getVerifyCode(setUserName.getText().toString(), setPwd.getText().toString());                startActivity(newIntent(this, MainActivity.class));break;caseR.id.tv_login:                getPresenter().login(setUserName.getText().toString(), setPwd.getText().toString(), setVerifyCode.getText().toString());break;        }    }}

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

Presenter也是同样,关注于Task的执行

/**

* Login Presenter

* Created by wujiajun on 17/4/7.

*/publicclassLoginPresenterextendsBasePresenterimplementsLoginContract.Presenter{@InjectGetVerifyCodeTask mGetVerifyCodeTask;@InjectLoginTask mLoginTask;@InjectpublicLoginPresenter() {    }@OverridepublicvoidgetVerifyCode(String userName, String pwd) {        mGetVerifyCodeTask.setUserName(userName);        mGetVerifyCodeTask.setPwd(pwd);        mGetVerifyCodeTask.setCallback(newUseCase.Callback() {@Overridepublicvoidsuccess(BaseStatus baseStatus) {                getView().toast("getVerifyCode success!");            }@Overridepublicvoidfail() {                getView().toast("getVerifyCode fail!");            }        });        getThreadExecutor().execute(mGetVerifyCodeTask);    }@Overridepublicvoidlogin(String userName, String pwd, String verifyCode) {        getView().showLoading();        mLoginTask.setUserName(userName);        mLoginTask.setPwd(pwd);        mLoginTask.setVerifyCode(verifyCode);        mLoginTask.setCallback(newUseCase.Callback() {@Overridepublicvoidsuccess(LoginResponse loginResponse) {                getView().toast("login success!");            }@Overridepublicvoidfail() {                getView().toast("login fail!");            }        });        getThreadExecutor().execute(mLoginTask);    }}

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

domain层只关注于怎么完成这个任务 请求验证码或者登录操做

/** * 获取验证码任务 * * @authorwujiajun */publicclassGetVerifyCodeTaskextendsAbstractUseCase{String publicKey ="11";    String userName;    String pwd;@InjectAppHttp appHttp;@InjectpublicGetVerifyCodeTask() {    }@Overridepublicvoidrun() {        appHttp.getVerifyCode(userName, SecretUtils.encryptByPublicKey(pwd, publicKey),newHttp.HttpCallback() {@OverridepublicvoidonResponse(BaseStatus baseStatus) {                getCallback().success(baseStatus);            }@OverridepublicvoidonFailure(Throwable t) {                getCallback().fail();            }        });    }publicvoidsetUserName(String userName) {this.userName = userName;    }publicvoidsetPwd(String pwd) {this.pwd = pwd;    }}

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

结语

EasyAndroid框架的主要部分都一一介绍了一下,以及它的思想,关于MVP这些我也参考了不少,简单DEMO的不少,真正可以使用的不多,写这个也想你们少走弯路,但愿把这个框架可以不断完善,至少DEMO中内容不多,感兴趣的能够Fork修改,有什么好的建议能够私聊我。

GitHub地址

https://github.com/wu928320442/EasyAndroid

须要的环境

JDK1.8

SDK

AndroidStudio开发工具

特性

整合主流HTTP网络、图片加载、MVP(Clean+Dagger2)架构的一套快速高效的开发框架

包含app library 两个Module 组件化开发

用到的第三方框架

SDK自带扩展依赖包

Retrofit2网络层处理 使用OKHTTP3处理

Fresco图片加载处理 使用OKHTTP3处理

OKHTTP3 HTTP基础库,提供给网络层处理和图片加载

PersistentCookieJar快速Cookie持久化与缓存库

Dagger2 依赖注入库,整合Activity,Fragment,Presenter,Task之间的依赖关系

Butterknife View的注入库

BaseRecyclerViewAdapterHelper Recycler下拉加载库

Utilcode实用工具库

Logger 一个简洁漂亮的日志打印库

类库导入

compile'com.wjj.easy:easyandroid:1.0.0'


摘自csdn:http://blog.csdn.net/wu928320442/article/details/70666908