Android MVP + 泛型,实现了友好VP交互及Activity潜在的内存泄露的优化

时间:2024-08-03 17:34:44

  Android MVP粗来已经有段时间了,在项目中我也多多少少用了一些,不得不说代码使用这种模式后,条例确实清晰了好多,整个流程看起来有点各司其职的感觉(另一种的java面向对象的方式)。

  不过这里是我在使用过程中遇到的一点小优化,直接进入代码来说吧!!!

 import java.lang.ref.Reference;
import java.lang.ref.WeakReference; public class Presenter <T>{ private Reference<T> mReference = null; public void onAttach(T view){
mReference = new WeakReference<T>(view);
}; public boolean isAttach(){
return null != mReference && null != mReference.get();
} public void onDettach(){
if(null != mReference){
mReference.clear();
mReference = null;
}
};
}

  上述代码我这里简单说下,泛型的定义是为了给Activity及其子类声明使用(为啥这么说,因为presenter是专门针对View工作的,他的定义必须依赖于View的功能来完成.),这里可以看到我简单是采用了弱引用的方式去参数这个View的对对象引用,这里我主要考虑到万一Activity不走onDestroy方法,但是程序却退出了,现实中这种可能性很小,不过确实是存在的,弱引用主要就是为了这个目的而加的。

  紧接着一起来看BaseActivity

 public abstract class BaseActivity<V, T extends Presenter<V>> extends Activity{

     protected T mPresenter;

     @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mPresenter = createPresener();
mPresenter.onAttach((V) this);
} @Override
protected void onDestroy() {
// TODO Auto-generated method stub
super.onDestroy();
mPresenter.onDettach();
} protected abstract T createPresener();
}

  这里可看到,这里由于是BaseActivity,我希望他去做的工作就是在Activty创建的时候先创建Presenter对象,并告知Presenter自己已经被创建,同时将自身注入给Presenter,以便于完成P到V的回调工作. T extent Presenter是为了保证createPrenter返回的事Presenter 的子类对象. 8行没有判空直接使用的目的是为了更好的使用MVP的思想,所以这里的抽象方法是不允许返回null的,这是我的个人设计,不过大家要是希望返回null,可以自己在进一步的坐下处理.

   之上的简单的VP交互,我是根据个人需求做的定义(Attach, Dettach, isAttach).