標籤:
Android MVP粗來已經有段時間了,在項目中我也多多少少用了一些,不得不說代碼使用這種模式後,條例確實清晰了好多,整個流程看起來有點各司其職的感覺(另一種的java物件導向的方式)。
不過這裡是我在使用過程中遇到的一點小最佳化,直接進入代碼來說吧!!!
1 import java.lang.ref.Reference; 2 import java.lang.ref.WeakReference; 3 4 public class Presenter <T>{ 5 6 private Reference<T> mReference = null; 7 8 public void onAttach(T view){ 9 mReference = new WeakReference<T>(view);10 };11 12 public boolean isAttach(){13 return null != mReference && null != mReference.get();14 }15 16 public void onDettach(){17 if(null != mReference){18 mReference.clear();19 mReference = null;20 }21 };22 }
上述代碼我這裡簡單說下,泛型的定義是為了給Activity及其子類聲明使用(為啥這麼說,因為presenter是專門針對View工作的,他的定義必須依賴於View的功能來完成.),這裡可以看到我簡單是採用了弱引用的方式去參數這個View的對對象引用,這裡我主要考慮到萬一Activity不走onDestroy方法,但是程式卻退出了,現實中這種可能性很小,不過確實是存在的,弱引用主要就是為了這個目的而加的。
緊接著一起來看BaseActivity
1 public abstract class BaseActivity<V, T extends Presenter<V>> extends Activity{ 2 3 protected T mPresenter; 4 5 @Override 6 protected void onCreate(Bundle savedInstanceState) { 7 super.onCreate(savedInstanceState); 8 mPresenter = createPresener(); 9 mPresenter.onAttach((V) this);10 }11 12 13 @Override14 protected void onDestroy() {15 // TODO Auto-generated method stub16 super.onDestroy();17 mPresenter.onDettach();18 }19 20 protected abstract T createPresener();21 }
這裡可看到,這裡由於是BaseActivity,我希望他去做的工作就是在Activty建立的時候先建立Presenter對象,並告知Presenter自己已經被建立,同時將自身注入給Presenter,以便於完成P到V的回調工作. T extent Presenter是為了保證createPrenter返回的事Presenter 的子類對象. 8行沒有判空直接使用的目的是為了更好的使用MVP的思想,所以這裡的抽象方法是不允許返回null的,這是我的個人設計,不過大家要是希望返回null,可以自己在進一步的坐下處理.
之上的簡單的VP互動,我是根據個人需求做的定義(Attach, Dettach, isAttach).
Android MVP + 泛型,實現了友好VP互動及Activity潛在的記憶體泄露的最佳化