類庫介紹 EasyAndroid
現在Android的框架很多,第三方庫也很多,當做一個項目的時候,會考慮怎麼整合那麼多的資源,以達到複用快速開發。
今天要說的這個框架就是整合了主流Retrofit2網絡層封裝、Fresco圖片加載、都使用OKHTTP3進行網絡處理、使用MVP架構,來快速靈活開發複用我們的項目。
爲什麼要使用它呢?我們來想想如果不使用它的話,我們直接操作OKHTTP3的網絡請求,還需要做哪些操作?當發送請求的時候,來封裝要以get或者post方式發送,然後回來了GJSON解析成我們需要的實體對象,還要看返回的數據相應碼等等,來正確解析我們的數據,那麼Retrofit2就是爲了高效解決這些事情的,當然Retrofit2不止這些功能,具體大家可看API。
比較了一些主流的圖片加載以及各種對比,Fresco算是綜合比較好的,支持較多,更新及時。
不解釋了 大家都在用
都是一些用的比較多的,Cookie自動管理、View注入Butterknife、以及RecycleView下拉刷新BaseRecyclerViewAdapterHelper、Utilcode工具庫、Logger日誌庫 大家以前沒用過的可以關注下 都很好用 靈活
下面重點說一下MVP的Clean模式,現在MVP很火,大行其道,不搞一套MVP架構都感覺缺少點啥,哈哈,爲什麼呢?MVP難道就是簡單的加了一個Presenter層嗎?顯然不是,它是一種思想,如果簡單的一個應用每個Activity類中500行搞定,還需要MVP嗎?我覺得就不適合了。越大型的APP、越複雜的APP纔會讓你覺得MVP的好。怎麼做到讓代碼各司其職。
上面這張圖就是Clean的架構,爲什麼需要Clean架構呢,我們來想想,我們把業務邏輯部分都放到了Presenter層,如果這個頁面做的邏輯很多,十來個業務操作(請求數據,數據庫操作等),這樣Presenter也會非常龐大,既然臃腫,我們繼續抽象,在Presenter層下面在加一層Use Cases Domain層,專門處理增刪改查等任務豈不業務更清晰明瞭,Presenter只需要執行相關UseCases任務,操作完回調處理就OK了。
Dagger2又是個什麼東東?我想說你寫了Activity或者Fragment依賴Prensenter,然後呢Clean模式又讓Presenter依賴UseCases,每次new一個實例進去,然後傳遞啊等等,想想都累,那麼Dagger2可以幫你生成這些實例,你依賴啥,我注入啥,這就是它的精髓依賴注入,不止這些,第三方庫,以及其它的提供者都可以進行注入,只要你需要,還有我們的Presenter對象的實例生命週期你怎麼管理,UseCases層的對象呢,這一切Dagger2可以幫你做到,可以自定義Scopes,java自動幫你處理
還有一點差點忘了爲什麼叫Dagger2,版本號2呢,因爲它2,哈哈,因爲Dagger1使用的是運行時反射機制,這樣會影響性能,Dagger2使用編譯時自動生成對應代碼,直接運行性能不會受到影響。
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
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修改,有什麼好的建議可以私聊我。
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