詹子聪 5 лет назад
Родитель
Сommit
38c1f79afe

+ 10 - 9
app/src/main/java/com/miekir/newmvp/ui/home/article/presenter/ArticlePresenter.java

@@ -1,6 +1,7 @@
 package com.miekir.newmvp.ui.home.article.presenter;
 
 import com.miekir.mvp.constant.MvpRepository;
+import com.miekir.mvp.model.InjectModel;
 import com.miekir.mvp.presenter.BasePresenter;
 import com.miekir.newmvp.ui.home.article.model.IArticleModel;
 import com.miekir.newmvp.ui.home.article.model.LocalArticleModel;
@@ -18,15 +19,15 @@ public class ArticlePresenter extends BasePresenter<IArticleView> {
     private IArticleModel mModel;
     private int mCurrentType = MvpRepository.REPO_NET;
 
-    @Override
-    public void onInit() {
-        mModel = new NetArticleModel();
-    }
+    @InjectModel
+    private NetArticleModel mNetModel;
+    @InjectModel
+    private LocalArticleModel mLocalModel;
+
 
     @Override
-    public void onTaskCancel() {
-        super.onTaskCancel();
-        mModel.onTaskCancel();
+    public void onInit() {
+        mModel = mNetModel;
     }
 
     /**
@@ -42,10 +43,10 @@ public class ArticlePresenter extends BasePresenter<IArticleView> {
 
         switch (type) {
             case MvpRepository.REPO_NET:
-                mModel = new NetArticleModel();
+                mModel = mNetModel;
                 break;
             case MvpRepository.REPO_FILE:
-                mModel = new LocalArticleModel();
+                mModel = mLocalModel;
                 break;
             default:
                 break;

+ 4 - 0
mvp/build.gradle

@@ -21,6 +21,10 @@ android {
             proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
         }
     }
+    compileOptions {
+        sourceCompatibility JavaVersion.VERSION_1_8
+        targetCompatibility JavaVersion.VERSION_1_8
+    }
 
 }
 

+ 17 - 0
mvp/src/main/java/com/miekir/mvp/model/InjectModel.java

@@ -0,0 +1,17 @@
+package com.miekir.mvp.model;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ *
+ * @author zhan
+ * @date 2019/8/19
+ */
+@Retention(RetentionPolicy.RUNTIME)
+@Target(ElementType.FIELD)
+public @interface InjectModel {
+
+}

+ 16 - 8
mvp/src/main/java/com/miekir/mvp/presenter/BasePresenter.java

@@ -5,11 +5,14 @@ import android.os.Looper;
 import androidx.lifecycle.ViewModel;
 
 import com.miekir.common.utils.LogTool;
+import com.miekir.mvp.model.IModel;
 import com.miekir.mvp.view.IView;
 import com.miekir.mvp.view.ViewHandler;
 
 import java.lang.ref.WeakReference;
 import java.lang.reflect.Proxy;
+import java.util.ArrayList;
+import java.util.List;
 import java.util.Optional;
 import java.util.function.Consumer;
 
@@ -29,8 +32,10 @@ import io.reactivex.disposables.CompositeDisposable;
 public abstract class BasePresenter<V extends IView> extends ViewModel {
     private WeakReference<V> mViewReference;
     protected CompositeDisposable mDisposableList = new CompositeDisposable();
+    private List<IModel> mModelList = new ArrayList<>();
 
     public BasePresenter() {
+        PresenterHelper.initModelList(mModelList, this);
         onInit();
     }
 
@@ -50,10 +55,16 @@ public abstract class BasePresenter<V extends IView> extends ViewModel {
         mViewReference = new WeakReference<V>(view);
     }
 
+    @Override
+    protected void onCleared() {
+        super.onCleared();
+        detachView();
+    }
+
     /**
      * 界面被销毁时
      */
-    public void detachView() {
+    private void detachView() {
         onTaskCancel();
         if (mViewReference != null) {
             mViewReference.clear();
@@ -61,18 +72,15 @@ public abstract class BasePresenter<V extends IView> extends ViewModel {
         }
     }
 
-    @Override
-    protected void onCleared() {
-        super.onCleared();
-        detachView();
-        LogTool.d(getClass().getName(), "view model clear:" + this.toString());
-    }
-
     /**
      * todo 当任务被取消时,界面还存在,响应加载框的取消
      */
     public void onTaskCancel() {
         mDisposableList.dispose();
+        for (IModel model : mModelList) {
+            model.onTaskCancel();
+        }
+        mModelList.clear();
     }
 
     /**

+ 52 - 0
mvp/src/main/java/com/miekir/mvp/presenter/PresenterHelper.java

@@ -0,0 +1,52 @@
+package com.miekir.mvp.presenter;
+
+import androidx.lifecycle.ViewModelProvider;
+import androidx.lifecycle.ViewModelStoreOwner;
+
+import com.miekir.mvp.model.IModel;
+import com.miekir.mvp.model.InjectModel;
+import com.miekir.mvp.view.IView;
+
+import java.lang.reflect.Field;
+import java.util.List;
+
+/**
+ * Copyright (C), 2019-2020, Miekir
+ *
+ * @author Miekir
+ * @date 2020/11/14 13:32
+ * Description:
+ */
+public class PresenterHelper {
+    private PresenterHelper() {}
+
+    /**
+     * 初始化添加注解的变量
+     */
+    public static  void initModelList(List<IModel> modelList, BasePresenter<?> presenter) {
+        modelList.clear();
+        // 这里可以获取到子类的成员变量
+        Field[] fields = presenter.getClass().getDeclaredFields();
+        for (Field field : fields) {
+            // 获取变量上面的注解类型
+            InjectModel presenterAnnotation = field.getAnnotation(InjectModel.class);
+            if (presenterAnnotation == null) {
+                continue;
+            }
+
+            try {
+                field.setAccessible(true);
+                // 父类引用指向子类对象
+                Class<IModel> type = (Class<IModel>) field.getType();
+                IModel model = type.newInstance();
+                field.set(presenter, model);
+                modelList.add(model);
+            } catch (IllegalAccessException | InstantiationException e) {
+                e.printStackTrace();
+            } catch (ClassCastException e) {
+                e.printStackTrace();
+                throw new RuntimeException(InjectPresenter.class.getName() + "注解修饰的类必须继承自:" + BasePresenter.class.getName());
+            }
+        }
+    }
+}

+ 0 - 2
mvp/src/main/java/com/miekir/mvp/view/ViewHelper.java

@@ -36,11 +36,9 @@ public class ViewHelper {
 
             try {
                 field.setAccessible(true);
-
                 // 父类引用指向子类对象
                 Class<? extends BasePresenter<?>> type = (Class<? extends BasePresenter<?>>) field.getType();
                 //BasePresenter<V> presenter = type.newInstance();
-                // todo 下面这种方法是单例形式,会造成重复回调的问题
                 BasePresenter presenter = new ViewModelProvider(owner).get(type);
                 field.set(iView, presenter);
                 presenter.attachView(iView);