MVP架构的好处有很多,但是使用Activity/Fragment
作为View
层有如下问题,
- 当内存不足,Activity被回收后,这使得状态的保存和恢复成为问题,因为涉及到了Model操作.
-
生命周期的控制问题也很麻烦,需要在Presenter中写一大堆和生命周期相关的接口规范
-
Activity中包含了很多系统服务,逻辑操作方便
现在通过holder编程的思想,将view抽取,所有view层的显示操作都在holder里边,并且对需要做的点击事件传递到activity/fragment层,
holder基类:
public abstract class BaseHolder<Data> { public View contentView; private Data data; public Activity mCtx; public BaseHolder() { this.contentView = initView(null); contentView.setTag(this); } public BaseHolder(View.OnClickListener a) { this.contentView = initView(a); contentView.setTag(this); } public BaseHolder(Activity a, View.OnClickListener b) { mCtx = a; this.contentView = initView(b); contentView.setTag(this); } public View getContentView() { return contentView; } public Data getData() { return data; } public void setData(Data data) { this.data = data; refreshView(data); } protected abstract View initView(View.OnClickListener innerOnclick); protected abstract void refreshView(Data data); }集成holder子类:
public class MyMainHolder extends BaseHolder { public DrawerLayout drawerLayout; private ImageView iv_setting; private FrameLayout flMenu; private MyMenuHolder menuHolder; public TextView tv_title; private FrameLayout fl_content; public MyMainHolder(View.OnClickListener in) { super(in); } @Override protected View initView(View.OnClickListener innerOnclick) { View view = UIUtils.inflate(R.layout.activity_main); iv_setting = (ImageView) view.findViewById(R.id.iv_setting); tv_title = (TextView) view.findViewById(R.id.tv_title); drawerLayout = (DrawerLayout) view.findViewById(R.id.drawerlayout); flMenu = (FrameLayout) view.findViewById(R.id.fl_menu); //菜单 fl_content = (FrameLayout) view.findViewById(R.id.fl_content); iv_setting.setOnClickListener(innerOnclick); menuHolder = new MyMenuHolder(innerOnclick); flMenu.addView(menuHolder.getContentView()); return view; } @Override protected void refreshView(Object o) { }}
activity/fragment层处理逻辑:
public class MyMainActivity extends MyBaseActivity implements View.OnClickListener { private MyMainHolder mMainHolder; @Override protected View initViews(final Context context) { mMainHolder = new MyMainHolder(this); return mMainHolder.getContentView(); } @Override public void onClick(View v) { switch (v.getId()) { case R.id.rl_button: // 点击关闭悬浮窗的时候,移除所有悬浮窗,并停止Service Toast.makeText(mCtx, "开门卫视", 0).show(); mMainHolder.drawerLayout.closeDrawers(); break; case R.id.iv_setting: // 点击关闭悬浮窗的时候,移除所有悬浮窗,并停止Service Toast.makeText(mCtx, "设置按钮", 0).show(); mMainHolder.drawerLayout.openDrawer(Gravity.LEFT); break; } } }可以发现,activity只用于处理逻辑,可以通过对象调用view,view可以通过点击对象,将事件传递到activity/fragment中进行事件处理