亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Android T-MVVM深度解耦開發框架

發布時間:2020-08-10 11:37:35 來源:網絡 閱讀:4253 作者:sq5b964702d8b05 欄目:移動開發

###前言
自從官方mvp的Sample出來后,鬧得熱火朝天的mvp,小碼也未能幸免加入MVP大坑中,入坑近2年的MVP的架構終于要說拜拜了,最近由于公司項目相對穩定,做了一次較大的重構,原來的MVP架構切換到了T-MVVM。整個項目清爽了許多。
###問題

MVP缺點:
 * Presenter中除了邏輯以外,還有大量的View->Model,Model->View的邏輯操作,造成     Presenter臃腫,維護困難。
 * 對UI的渲染放在了Presenter中,所以UI和Presenter的交互會過于頻繁。
 * Presenter過多地渲染了UI,往往會使得它與特定的UI的交互頻繁。一旦UI變動,Presenter也需要變
 * 接口暴增,可以說代碼量成倍增長,交互都需要通過接口傳遞信息,讓人無法忍受.

基本上用過mvp的碼友們都能發現了以上諸多弊端。于是小碼就嘗試從傳統的MVP過度到T-MVVM,深度結構,告別繁瑣的接傳遞信息。
如果項目業務不是很多或者業務相對簡單,其實完全沒有必要使用mvp,反而讓項目變得更為復雜。

###T-MVVM代碼,如果有幫助記得star哦<https://github.com/SelfZhangTQ/T-MVVM>
基于ViewModel,LiveData,Retrofit,Rxjava實現T-MVVM體系結構的架構,泛型限定,深度解耦。

ViewModel優點:
 * 同步關聯生命周期,
 * 數據共享 ,
 * 復用性強 ,
LiveData優點:
 * 確保UI界面的數據狀態,
 * 沒有內存泄漏,不會因為Activity的不可見導致Crash,
 * 不用再人為的處理生命周期,
 * 共享資源,

此架構未使用DataBinding原由:

* 數據綁定增加Bug調試難度,
* 復雜的頁面,model也會很大,雖然使用方便了也很容易保證了數據的一致性,當時長期持有,不利于釋放內存,
* 數據雙向綁定不利于View重用,

###T-MVVM架構分層代碼
1:先定義BaseViewModel基類

 /**
  * @author:tqzhang on 18/7/26 16:15
  */
  public class BaseViewModel<T extends BaseRepository> extends AndroidViewModel {

    public T mRepository;

    public BaseViewModel(@NonNull Application application) {
        super(application);
        mRepository = TUtil.getNewInstance(this, 0);
    }

    @Override
    protected void onCleared() {
        super.onCleared();
        if (mRepository != null) {
           mRepository.unSubscribe();
        }

   }
 }

BaseViewModel通過泛型類型參數BaseRepository子類初始化Repository數據倉庫,同時在activity/fragment走onDestroy()生命周期方法時 BaseViewModel回調onCleared,即頁面銷毀是用來取消網絡請求或資源釋放等操作。

正常開發一般不建議直接通過ViewModel獲取網絡數據,這里我們將工作交給一個新的模塊Repository。Repository只負責數據處理,提供干凈的api,方便切換數據來源。

2:再定義BaseRepository

public abstract class BaseRepository {

     protected ApiService apiService;

     public BaseRepository() {
             if (null == apiService) {
                 apiService = HttpHelper.getInstance().create(ApiService.class);
             }
     }

     private CompositeSubscription mCompositeSubscription;

     protected void addSubscribe(Subscription subscription) {
            if (mCompositeSubscription == null) {
                mCompositeSubscription = new CompositeSubscription();
            }
           mCompositeSubscription.add(subscription);
      }

     public void unSubscribe() {
             if (mCompositeSubscription != null && mCompositeSubscription.hasSubscriptions()) {
            mCompositeSubscription.clear();
    }
}

BaseRepository中內容相對簡單,主要是獲取ApiService和網絡請求訂閱容器,方便管理網絡請求。

3:然后自定義AbsLifecycleFragment基類繼承BaseFragment,BaseFragment可自行編寫。如不需要使用T-MVVM,可自行繼承BaseFragment,互不影響。

 public abstract class AbsLifecycleFragment<T extends BaseViewModel> extends BaseFragment  {

       protected T mViewModel;
       /**
        * init view
        * @param state
        */
       @Override
       public void initView(Bundle state) {
            mViewModel = VMProviders(this, TUtil.getInstance(this, 0));
          if (null != mViewModel) {
            dataObserver();
          }
       }

      /**
       * create ViewModelProviders
       *
       * @return ViewModel
       */
      protected <T extends ViewModel> T VMProviders(BaseFragment fragment, @NonNull Class<T> modelClass) {
           return ViewModelProviders.of(fragment).get(modelClass);
      }

      protected void dataObserver() {

      }

     /**
      * 獲取網絡數據
      */
      protected void getRemoteData() {

      } 

    }

在initView方法中通過BaseViewModel子類泛型類型參數獲取Class<T>,在通過ViewModelProviders.of(fragment).get(modelClass))實例化ViewModel,
到此我們的基類基本編寫完畢。

4:下面我們以一個簡單業務實戰下,獲取文章列表。

4-1:ArticleFragment

/**
* @author:zhangtianqiu on 18/7/2 14:40
*/
public class ArticleFragment extends AbsLifecycleFragment<ArticleViewModel> {  
 protected TRecyclerView mRecyclerView;
 protected StaggeredGridLayoutManager layoutManager;
 protected MultiTypeAdapter adapter;

 public static ArticleFragment newInstance() {
    return new ArticleFragment();
 }

 @Override
 public int getLayoutResId() {
    return R.layout.fragment_list;
 }

 @Override
 public void initView(Bundle state) {
    super.initView(state);
    layoutManager=new new StaggeredGridLayoutManager(1,  StaggeredGridLayoutManager.VERTICAL);
    //獲取網絡數據
    getRemoteData();
 }

 //初始化adapter
 public void initAdapter(){
   adapter= new MultiTypeAdapter.Builder<>()
           .bindArray(ArticleInfoVo.class, new ArticleRem1ItemHolder(context)
            , new ArticleRem2ItemHolder(context)
            , new ArticleRem3ItemHolder(context))
           .bind(HeaderVo.class, new HeaderViewHolder(context, rogressStyle.Pacman))
           .bind(FootVo.class, new FootViewHolder(context, ProgressStyle.Pacman))
           .build();

 //數據觀察
 @Override
 protected void dataObserver() {
    mViewModel.getArticleList().observe(this, articleVo -> {
        if (null != articleVo) {
           mRecyclerView.refreshComplete(articleVo.data.list, false);
        }
    });
 }
 //獲取網絡數據
 @Override
 protected void getRemoteData() {
     mViewModel.getArticleList(typeId, lastId);
 }
}

我們可以看出來ArticleFragment中只有UI初始化,發請網絡請求action以及數據觀察更新UI,列表展示用了TRecyclerView,歡迎star哦面向holder開發高復用,多類型的刷新庫,從此只關心你的列表的Item展示。
通過泛型除去了MVP中通過接口傳遞信息的大量代碼,
從此see you Mass implementation of interfaces。

4-1:ArticleViewModel

/**
* @author:tqzhang on 18/7/26 16:15
*/
public class ArticleViewModel extends BaseViewModel<ArticleRepository> {

     private MutableLiveData<ArticleVo> mArticleData;

     public ArticleViewModel(@NonNull Application application) {
          super(application);
     }

     public LiveData<ArticleVo> getArticleList() {
          if (mArticleData == null) {
              mArticleData = new MutableLiveData<>();
          }
         return mArticleData;
     }

    public void getArticleList(String lectureLevel1, String lastId) {
          mRepository.loadArticleRemList(new CallBack<ArticleVo>() {
        @Override
        public void onNext(ArticleVo articleObject) {
            mArticleData.postValue(articleObject);
        }

        @Override
        public void onError(String e) {

        }            }
    });
}

ArticleViewModel中持有數據觀察容器LiveData和真正發起網絡請求動作,在接收到服務端返回的數據通過
mArticleData.postValue(articleObject);通知Observer數據的更改,此處需注意的是,setValue方法只能在主線程中調用,postValue可以在任何線程中調用,如果是在后臺子線程中更新LiveData的值,必須調用postValue。

4-3:ArticleRepository

/**
 * @author:tqzhang on 18/7/28 13:00
 */
 public class ArticleRepository extends BaseRepository {

      public void loadArticleRemList(final CallBack<ArticleVo> listener) {
          addSubscribe(apiService.getArticleRemList()
                .compose(RxSchedulers.io_main())
                .subscribe(new RxSubscriber<ArticleVo>() {

                    @Override
                    public void onSuccess(ArticleVo articleObject) {
                        listener.onNext(articleObject);
                    }

                    @Override
                    public void onFailure(String msg) {
                        listener.onError(msg);
                    }
            }));

}

最后我們的ArticleRepository中就提供數據,此處只提供了網絡層的數據,在實際應用中可拆分類loacl data和remote data,可根據項目需求自行處理。
至此咋們一個簡單業務代碼就完成了,是驢子是馬,拉出來溜溜就知道,實踐出真知,效果圖奉上:
Android T-MVVM深度解耦開發框架

項目地址github地址:<https://github.com/SelfZhangTQ/T-MVVM>,歡迎大家交流,star。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

肇州县| 扶绥县| 忻城县| 隆昌县| 巧家县| 寿光市| 玉环县| 阳山县| 鄂伦春自治旗| 阜南县| 马公市| 横峰县| 汶川县| 营口市| 兴山县| 碌曲县| 静海县| 托克逊县| 时尚| 本溪| 平武县| 尼玛县| 华坪县| 宁远县| 晋中市| 财经| 柳州市| 诸暨市| 运城市| 汉源县| 海安县| 亚东县| 巨野县| 青川县| 河西区| 郴州市| 定西市| 海伦市| 横峰县| 泸定县| 芒康县|