[Android開源]一套快速高效的開發框架EasyAndroid

類庫介紹 EasyAndroid

現在Android的框架很多,第三方庫也很多,當做一個項目的時候,會考慮怎麼整合那麼多的資源,以達到複用快速開發。

今天要說的這個框架就是整合了主流Retrofit2網絡層封裝、Fresco圖片加載、都使用OKHTTP3進行網絡處理、使用MVP架構,來快速靈活開發複用我們的項目。

框架說明

Retrofit2

爲什麼要使用它呢?我們來想想如果不使用它的話,我們直接操作OKHTTP3的網絡請求,還需要做哪些操作?當發送請求的時候,來封裝要以get或者post方式發送,然後回來了GJSON解析成我們需要的實體對象,還要看返回的數據相應碼等等,來正確解析我們的數據,那麼Retrofit2就是爲了高效解決這些事情的,當然Retrofit2不止這些功能,具體大家可看API。

Fresco

比較了一些主流的圖片加載以及各種對比,Fresco算是綜合比較好的,支持較多,更新及時。

OKHTTP3

不解釋了 大家都在用

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章