Android MVP 構架封裝


上一篇我們簡單實現了一個MVP的構架,下面我們來做一個簡單的封裝使其使用更簡單方便

源碼地址RxMVP分支Tag03

最終實現目錄結構如下

BasePresenter

如果每一個Activity都需要做綁定和解綁操作就太麻煩了,現在我希望可以有一個通用的presenter來為我們添加view的綁定與銷毀。

public abstract class BasePresenter<T> {
    public T mView;

    public void attach(T mView){
        this.mView = mView;
    }

    public void dettach(){
        mView = null;
    }
}

因為不能限定死傳入的View,所以使用泛型來代替傳入的對象。通過這個通用的presenter我就可以把原來的MvpPresenter簡化成下面的樣子

public class NewMvpPresenter extends BasePresenter<NewMvpView> {
        private RequestBiz requestBiz;
        private Handler mHandler;

        public NewMvpPresenter() {        
            requestBiz = new RequestBizIml();
            mHandler = new Handler(Looper.getMainLooper());
        }    

        public void onResume(){        
            requestBiz.requestForData(new OnRequestListener() {
                @Override            
                public void onSuccess(final List<String> data) {
                    //由於請求開啟了新線程,所以用handler去更新界面
                    mHandler.post(new Runnable() {                    
                      @Override                    
                       public void run() {                        
                           mView.hideLoading();                        
                           mView.setListItem(data);                    
                        }                
                    });            
                 }            

                 @Override            
                 public void onFailed() {                
                     mView.showMessage("請求失敗");            
                 }        
            });    
       }   

        public void onItemClick(int position){        
              mView.showMessage("點擊了item"+position);     
        }
}

BaseView

界面需要提供的UI方法中會有很多類似的UI方法,可以把它們提取到一個公共的父類接口中。比如提取顯示loading界面和隱藏loading界面的方法,其他的view層接口就可以直接繼承BaseView接口,不必重復的寫顯示和隱藏loading界面方法。

public interface BaseView {
    void showLoading();
    void hideLoading();
}

BaseMvpActivity

presenter綁定到activity和View的綁定和解綁操作是每個Activity都會去做的,同樣這里我也希望能有一個父類來完成這個統一的操作。

public abstract class BaseMvpActivity<V,T extends BasePresenter<V>> extends AppCompatActivity {

    public T presenter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        presenter = initPresenter();
    }

    @Override
    protected void onResume() {
        super.onResume();
        presenter.attach((V)this);
    }

    @Override
    protected void onDestroy() {
        presenter.dettach();
        super.onDestroy();
    }

    public abstract T initPresenter();

}

同樣使用泛型來提取通用的邏輯,presenter的初始化,以及view的綁定和解綁操作都提取到父類Activity中。向外部提供了一個 initPresenter(); 方法用來初始化presenter,如果想創建不同參數的構造函數都可以隨意去創建。

基於BaseMVP的栗子

通過上面的base父類,對之前的例子進行優化,寫一個更加好用的例子。

NewMvpView

  • NewMvpView 繼承BaseView接口,添加自己的初始化ListView和Toast信息方法
public interface NewMvpView extends BaseView {
        void setListItem(List<String> data);
        void showMessage(String message);
}

NewMvpPresenter

  • NewMvpPresenter 繼承BasePresenter類,增加網絡請求和處理點擊事件的方法
public class NewMvpPresenter extends BasePresenter<NewMvpView> {
        private RequestBiz requestBiz;
        private Handler mHandler;

        public NewMvpPresenter() {        
            requestBiz = new RequestBizIml();
            mHandler = new Handler(Looper.getMainLooper());
        }    

        public void onResume(){     
            mView.showLoading();   
            requestBiz.requestForData(new OnRequestListener() {
                @Override            
                public void onSuccess(final List<String> data) {
                    //由於請求開啟了新線程,所以用handler去更新界面
                    mHandler.post(new Runnable() {
                      @Override                    
                       public void run() {                        
                           mView.hideLoading();                        
                           mView.setListItem(data);                    
                        }                
                    });            
                 }            

                 @Override            
                 public void onFailed() {                
                     mView.showMessage("請求失敗");            
                 }        
            });    
       }   

        public void onItemClick(int position){        
              mView.showMessage("點擊了item"+position);     
        }
}
  • NewMvpActivity 最終的樣子
public class NewMvpActivity extends BaseMvpActivity<NewMvpView, NewMvpPresenter> implements NewMvpView, AdapterView.OnItemClickListener {
    @BindView(R.id.mvp_listview)
    ListView mvpListView;

    MvpPresenter mvpPresenter;
    SweetAlertDialog pd;
    Context mContext;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mContext = this;
        ButterKnife.bind(this);
        mvpListView.setOnItemClickListener(this);
    }

    @Override
    protected void onResume() {
        super.onResume();
        presenter.onResume();
    }

    @Override
    public NewMvpPresenter initPresenter() {
        return new NewMvpPresenter();
    }

    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
        presenter.onItemClick(position);
    }

    @Override
    public void setListItem(List<String> data) {
        ArrayAdapter adapter = new ArrayAdapter(this, android.R.layout.simple_list_item_1, data);
        mvpListView.setAdapter(adapter);
    }

    @Override
    public void showMessage(String message) {
        Toast.makeText(this, message, Toast.LENGTH_SHORT).show();
    }

    @Override
    public void showLoading() {
        if (pd == null) {
            pd = new SweetAlertDialog(mContext, SweetAlertDialog.PROGRESS_TYPE);
            pd.getProgressHelper().setBarColor(Color.parseColor("#A5DC86"));
            pd.setTitleText("Loading");
            pd.setCancelable(true);
        }
        pd.show();
    }

    @Override
    public void hideLoading() {
        pd.hide();
    }
}

源碼地址:https://github.com/Javen205/RxMVP 歡飲Start

轉載:http://blog.csdn.net/dantestones/article/details/51445208


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM