Dagger2在Mvp的應用
- 2020 年 2 月 12 日
- 筆記
介紹http://www.jianshu.com/p/39d1df6c877d
大致實現步驟如下
PresenterComponent類
@Singleton @Component(modules = {PresenterModule.class}) public interface PresenterComponent { /** * 注入點 * @param activity 表示需要使用DaggerPresenterComponent.create().inject(this);注入的地方, * 注意,此處一定不要使用Activity,需要使用MainActivity,否則的話會報空指針異常。 * 因為這裡的注入點是什麼,就會到該類裏面去找。如果寫Activity,就會到Activity裏面去找, * 而Activity中並沒有@inject,即沒有需要注入的地方,所以在生成的DaggerPresenterComponent * 中,方法就不會被調用。 */ void inject( MainActivity activity); }
PresenterModule類
DownloadQuanCryPre downloadQuanCryPre; DownloadQuanDataPre downloadQuanDataPre; public PresenterModule(MainActivity activity) { downloadQuanCryPre =new DownloadQuanCryPre(activity,activity); downloadQuanDataPre =new DownloadQuanDataPre(activity,activity); } }
在Activity
@Inject public DownloadQuanCryPre downloadQuanCryPre; @Inject public DownloadQuanDataPre downloadQuanDataPre; //oncreate()方法中 DaggerPresenterComponent.builder().presenterModule(new PresenterModule(this)).build().inject(this);
BasePresenter(註:BasePresenter<IRequestCollectView,BaseActivity> 可以引入BaseActivity,這樣可以在多個Activity中復用)
public class BasePresenter<V, T> implements LifeCycleListener { protected Reference<V> mViewRef; protected V mView; protected Reference<T> mActivityRef; protected T mActivity; public BasePresenter(V view, T activity) { attachView(view); attachActivity(activity); setListener(activity); } /** * 設置生命周期監聽 * * @author ZhongDaFeng */ private void setListener(T activity) { if (getActivity() != null) { if (activity instanceof BaseActivity) { ((BaseActivity) getActivity()).setOnLifeCycleListener(this); } else if (activity instanceof BaseFragmentActivity) { ((BaseFragmentActivity) getActivity()).setOnLifeCycleListener(this); } } } /** * 關聯 * * @param view */ private void attachView(V view) { mViewRef = new WeakReference<V>(view); mView = mViewRef.get(); } /** * 關聯 * * @param activity */ private void attachActivity(T activity) { mActivityRef = new WeakReference<T>(activity); mActivity = mActivityRef.get(); } /** * 銷毀 */ private void detachView() { if (isViewAttached()) { mViewRef.clear(); mViewRef = null; } } /** * 銷毀 */ private void detachActivity() { if (isActivityAttached()) { mActivityRef.clear(); mActivityRef = null; } } /** * 獲取 * * @return */ public V getView() { if (mViewRef == null) { return null; } return mViewRef.get(); } /** * 獲取 * * @return */ public T getActivity() { if (mActivityRef == null) { return null; } return mActivityRef.get(); } /** * 是否已經關聯 * * @return */ public boolean isViewAttached() { return mViewRef != null && mViewRef.get() != null; } /** * 是否已經關聯 * * @return */ public boolean isActivityAttached() { return mActivityRef != null && mActivityRef.get() != null; } @Override public void onCreate(Bundle savedInstanceState) { } @Override public void onStart() { } @Override public void onRestart() { } @Override public void onResume() { } @Override public void onPause() { } @Override public void onStop() { } @Override public void onDestroy() { detachView(); detachActivity(); } }
//presenter 繼承上面的BasePresenter if (getView() != null&&getActivity()!=null){ if(!quanCryBean.isError()) getView().loadCry(quanCryBean.getQuan_category()); else getView().loadCryFail(quanCryBean.getError_msg()); }