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 @Override 14 protected void onDestroy() { 15 // TODO Auto-generated method stub 16 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).