MVP 全称:Model-View-Presenter ;
MVP 是从经典的模式MVC演变而来,它们的基本思想有相通的地方:Controller/Presenter负责逻辑的处理,Model提供数据,View负责显示 ,MVP模式隔绝了View层和Model层间的通信,两者间交互通过中间层Presenter,降低了耦合度。
以下代码是基于mvp模式实现的简易封装:
1.定义baseview
public abstract class BaseFragment<T extends BasePresenter> extends Fragment { protected Context mContext; protected View mParentView; public T mPresenter; @Override public void onAttach(Context context) { this.mContext = context; super.onAttach(context); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { mParentView = inflater.inflate(getContainerViewId(), container, false); mPresenter = initPresenter(); init(); return mParentView; } @Override public void onDestroy() { if (mPresenter != null) { mPresenter.detachView(); } super.onDestroy(); } @Override public void onDetach() { super.onDetach(); mContext = null; } protected abstract int getContainerViewId(); public abstract T initPresenter(); protected abstract void init(); }
2.定义basepresenter
public class BasePresenter<V> { public WeakReference<V> mView; public BasePresenter(V view) { mView = new WeakReference<V>(view); } public void detachView() { if (mView != null) { unRegisterListener(); mView.clear(); mView = null; } } public void unRegisterListener() { } }
3.定义DemoPresenter实现BasePresenter
public class DemoPresenter extends BasePresenter<DemoContract.View> implements DemoContract.Presenter , OnDataChangeListener{ private DemoModel mStockModel; public DemoPresenter(DemoContract.View view) { super(view); mStockModel = DemoModel.getInstance(); mStockModel.registerDataChangeListener(this); } @Override public void getData() { mStockModel.getData(); } @Override public void onDataCallBack( List<ResponseData> responseDatas) { mView.get().updateUI(event, responseDatas); } @Override public void unRegisterListener() { mStockModel.unRegisterDataChangeListener(this); } }
4.定义Model
public class DemoModel { private static DemoModel mInstance; private List<OnDataChangeListener> mOnDataChangeListeners; private Handler mHandler = new Handler(); public static DemoModel getInstance() { if (mInstance == null) { synchronized (DemoModel.class) { if (mInstance == null) { mInstance = new DemoModel(); } } } return mInstance; } private DemoModel() { } public void getData() { //假数据 notifyDataChanged(responseData); } private void notifyDataChanged(final List<String> responseData) { if (mOnDataChangeListeners != null) { for (final OnDataChangeListener onDataChangeListener : mOnDataChangeListeners) { mHandler.post(new Runnable() { @Override public void run() { onDataChangeListener.onDataCallBack( responseData); } }); } } } public void registerDataChangeListener(OnDataChangeListener onDataChangeListener) { if (mOnDataChangeListeners == null) { mOnDataChangeListeners = new ArrayList<>(); } if (!mOnDataChangeListeners.contains(onDataChangeListener)) { mOnDataChangeListeners.add(onDataChangeListener); } } public void unRegisterDataChangeListener(OnDataChangeListener onDataChangeListener) { if (mOnDataChangeListeners != null && mOnDataChangeListeners.contains(onDataChangeListener)) { mOnDataChangeListeners.remove(onDataChangeListener); } } }
5.View层
public class DemoFragment<DemoPresenter> extends BaseFragment implements DemoContract.View{ public static DemoFragment newsInstance() { return new DemoFragment(); } @Override protected int getContainerViewId() { return R.layout.extend_fragment_weather; } @Override public DemoPresenter initPresenter() { return new DemoPresenter(); } @Override protected void init() { } @Override public void showDialog() { //todo } }
编写完毕,可直接借鉴使用!!!