MVPArms MVP快速集成框架
前言
-
今年的Android技術圈中 MVP , Dagger2 , Rxjava , Retrofit 這些詞匯非常火,隨便打開一個技術論壇都充斥著大量的關于這些技術的文章, Github 也充斥著各種以 基于MVP+Retrofit+RxJava+Dagger2+MaterialDesign開發的xxxx 為標題的開源項目或 Demo .
-
但是大家這么熱心的開源此類項目,一直重復的做著同樣的事 教授大家使用的方式和技巧 有沒有想過依賴一個第三方庫,就可以快速的搭建此類框架?
What is MVPArms?
-
MVPArms 是一個集成了大量 Android 主流框架,并且全部使用 Dagger2 管理,以及提供API將所有庫連接起來方便使用,還提供詳細的 Wiki文檔 .
-
它可以使開發后面的所有項目都不用重復的復制粘貼(用過此類框架的朋友應該知道,這些庫都依賴其它的庫,就算一個build.gradle都會浪費很多時間),一個依賴省去很多煩惱,而且對于新手來說這些框架難的不僅僅是API的使用,更難的是怎么把它們結合到一起,應對各種場景的使用.
-
對于一個新的 Android 項目,特別是熟練使用 Dagger2 和 Rxjava 的開發者,你們只需要將此項目 Clone 下來, Demo 只實現了一個頁面,將此頁面刪除掉,添加所需要的 Retrofit API ,你的框架就搭建好了,你就可以直接使用 Demo 進行后續的開發,包結構也適合后面的擴展.
Feature
- 支持大型項目的開發方便擴展,Demo的包結構直接可以拿來用
- 全部使用 Dagger2 管理
- 大量使用 Rxjava
- 提供 Mvp 基類,快速接入
- 全部 UI 自適應
- 圖片加載類 ImageLoader 使用策略模式和建造者模式,輕松切換圖片加載框架和擴展
- Model層提供Retrofit API和緩存,是否使用緩存自行選擇
- 全局 http Request ( Params , headers ) Response ( Params , 耗時 )信息監聽,可解析json后根據狀態碼做相應操作
- 全局 Rxjava 錯誤處理,錯誤后自動重試
Where?
Structure
How?
Wiki
Contract
根據 Google 官方的 MVP 項目 ,可以在 Contract 中定義 MVP 的接口,便于管理,此框架使用 Dagger 注入 Presenter 無需定義 Presenter 接口,所以 Contract 只定義 Model 和 View 的接口
public interface UserContract {
//對于經常使用的關于UI的方法可以定義到BaseView中,如顯示隱藏進度條,和顯示文字消息
interface View extends BaseView {
void setAdapter(DefaultAdapter adapter);
void startLoadMore();
void endLoadMore();
}
//Model層定義接口,外部只需關心model返回的數據,無需關心內部細節,及是否使用緩存
interface Model {
Observable<List<User>> getUsers(int lastIdQueried, boolean update);
}
}
View
一般讓 Activity 或 Fragment 實現 Contract 中定義的 View 接口,供 Presenter 調用對應方法操作 UI , BaseActivity 默認注入 Presenter ,如想使用 Presenter ,必須指定 Presenter的范型 ,和實現 setupActivityComponent 來提供 Presenter 需要的 Component 和 Module
public class UserActivity extends WEActivity<UserPresenter> implements UserContract.View {
@Override
protected void setupActivityComponent(AppComponent appComponent) {
DaggerUserComponent
.builder()
.appComponent(appComponent)
.userModule(new UserModule(this))
.build()
.inject(this);
}
@Override
protected View initView() {
return LayoutInflater.from(this).inflate(R.layout.activity_user, null, false);
}
@Override
protected void initData() {
}
}</code></pre>
Model
Model實現 Contract 的 Model 接口,并且繼承 BaseModel ,指定范型為 ServiceManager 和 CacheManager ,然后通過兩個 Manager 拿到需要的 Service 和 Cache 為 Presenter 提供需要的數據(是否使用緩存請自行選擇, Presenter 無需關心細節)
public class UserModel extends BaseModel<ServiceManager,CacheManager> implements UserContract.Model{
private CommonService mCommonService;
private CommonCache mCommonCache;
public UserModel(ServiceManager serviceManager, CacheManager cacheManager) {
super(serviceManager, cacheManager);
this.mCommonService = mServiceManager.getCommonService();
this.mCommonCache = mCacheManager.getCommonCache();
}
@Override
public Observable<List<User>> getUsers(int lastIdQueried, boolean update) {
}
}</code></pre>
Presenter
Presenter在 MVP 中的大部分的作用為通過從 Model 層接口獲取數據,在調用 View 層接口顯示數據,首先實現 BasePresenter ,指定 Model 和 View 的范型,注意一定要指定 Contract 中定義的接口, Presenter 需要的 Model 和 View ,都使用 Dagger2 注入,這樣即解藕又方便測試, 怎么注入?
@ActivityScope
public class UserPresenter extends BasePresenter<UserContract.Model, UserContract.View> {
@Inject
public UserPresenter(UserContract.Model model, UserContract.View rootView) {
super(model, rootView);
}
//這里定義業務方法,相應用戶的交互
public void requestUsers(final boolean pullToRefresh) {
}
}</code></pre>
來自:http://www.jianshu.com/p/48e66e879061