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 項目,特別是熟練使用 Dagger2Rxjava 的開發者,你們只需要將此項目 Clone 下來, Demo 只實現了一個頁面,將此頁面刪除掉,添加所需要的 Retrofit API ,你的框架就搭建好了,你就可以直接使用 Demo 進行后續的開發,包結構也適合后面的擴展.

Feature

  • 支持大型項目的開發方便擴展,Demo的包結構直接可以拿來用
  • 全部使用 Dagger2 管理
  • 大量使用 Rxjava
  • 提供 Mvp 基類,快速接入
  • 全部 UI 自適應
  • 圖片加載類 ImageLoader 使用策略模式和建造者模式,輕松切換圖片加載框架和擴展
  • Model層提供Retrofit API和緩存,是否使用緩存自行選擇
  • 全局 http Request ( Params , headers ) Response ( Params , 耗時 )信息監聽,可解析json后根據狀態碼做相應操作
  • 全局 Rxjava 錯誤處理,錯誤后自動重試

Where?

MVPArms歡迎 StarFork

Structure

How?

Wiki

詳細用法請參照Wiki,下面只是簡單的介紹下MVP

Contract

根據 Google 官方的 MVP 項目 ,可以在 Contract 中定義 MVP 的接口,便于管理,此框架使用 Dagger 注入 Presenter 無需定義 Presenter 接口,所以 Contract 只定義 ModelView 的接口

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

一般讓 ActivityFragment 實現 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實現 ContractModel 接口,并且繼承 BaseModel ,指定范型為 ServiceManager CacheManager ,然后通過兩個 Manager 拿到需要的 ServiceCachePresenter 提供需要的數據(是否使用緩存請自行選擇, 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 ,指定 ModelView 的范型,注意一定要指定 Contract 中定義的接口, Presenter 需要的 ModelView ,都使用 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

 

 本文由用戶 rice_jiang 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!