上一篇我們簡單實現了一個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