詹子聪 5 anni fa
parent
commit
9aff473221

+ 2 - 2
app/src/main/java/com/miekir/newmvp/AActivity.java

@@ -9,11 +9,11 @@ import android.widget.TextView;
 
 import com.miekir.mvp.presenter.DataMethod;
 import com.miekir.mvp.presenter.InjectViewModel;
-import com.miekir.mvp.view.model.BaseMVPActivity;
+import com.miekir.mvp.view.model.BaseMvpActivity;
 
 import java.util.List;
 
-public class AActivity extends BaseMVPActivity {
+public class AActivity extends BaseMvpActivity {
     @InjectViewModel
     TestViewModel1 viewModel1;
 

+ 2 - 2
app/src/main/java/com/miekir/newmvp/BActivity.java

@@ -9,11 +9,11 @@ import android.widget.TextView;
 
 import com.miekir.mvp.presenter.DataMethod;
 import com.miekir.mvp.presenter.InjectViewModel;
-import com.miekir.mvp.view.model.BaseMVPActivity;
+import com.miekir.mvp.view.model.BaseMvpActivity;
 
 import java.util.List;
 
-public class BActivity extends BaseMVPActivity {
+public class BActivity extends BaseMvpActivity {
     @InjectViewModel
     TestViewModel1 viewModel1;
 

+ 2 - 2
app/src/main/java/com/miekir/newmvp/CActivity.java

@@ -8,11 +8,11 @@ import android.widget.TextView;
 
 import com.miekir.mvp.presenter.DataMethod;
 import com.miekir.mvp.presenter.InjectViewModel;
-import com.miekir.mvp.view.model.BaseMVPActivity;
+import com.miekir.mvp.view.model.BaseMvpActivity;
 
 import java.util.List;
 
-public class CActivity extends BaseMVPActivity implements ICView {
+public class CActivity extends BaseMvpActivity implements ICView {
     @InjectViewModel
     TestViewModel1 viewModel1;
 

+ 2 - 2
app/src/main/java/com/miekir/newmvp/MainActivity.java

@@ -9,12 +9,12 @@ import android.widget.Toast;
 
 import com.miekir.mvp.presenter.DataMethod;
 import com.miekir.mvp.presenter.InjectViewModel;
-import com.miekir.mvp.view.model.BaseMVPActivity;
+import com.miekir.mvp.view.model.BaseMvpActivity;
 
 import java.util.ArrayList;
 import java.util.List;
 
-public class MainActivity extends BaseMVPActivity {
+public class MainActivity extends BaseMvpActivity {
     @InjectViewModel
     TestViewModel1 viewModel1;
 

+ 2 - 1
mvp/src/main/java/com/miekir/mvp/base/BaseActivity.java

@@ -11,10 +11,11 @@ import android.view.inputmethod.InputMethodManager;
 
 import androidx.appcompat.app.AppCompatActivity;
 
+import com.miekir.mvp.view.OldBaseMVPActivity;
 import com.miekir.mvp.widget.LoadingDialog;
 
 /**
- * 适配器模式,这个类会适配子类{@link com.miekir.mvp.view.BaseMVPActivity}的功能,帮子类实现具体的弹出加载框、弹出提示等基本操作
+ * 适配器模式,这个类会适配子类{@link OldBaseMVPActivity}的功能,帮子类实现具体的弹出加载框、弹出提示等基本操作
  */
 public abstract class BaseActivity extends AppCompatActivity {
     private LoadingDialog mLoadingDialog;

+ 1 - 2
mvp/src/main/java/com/miekir/mvp/view/BaseMVPActivity.java

@@ -22,9 +22,8 @@ import java.util.List;
  * 筛选出父类是{@link BasePresenter}的成员变量,对它们进行实例化
  * 然后BaseMVPActivity调用{@link BasePresenter}的一个方法把自身的{@link androidx.lifecycle.LiveData}类型引用
  * 传递给{@link BasePresenter},这样{@link BasePresenter}的子类就可以调用相应Activity的LiveData;
- *
  */
-public abstract class BaseMVPActivity extends BaseActivity implements IView {
+public abstract class OldBaseMVPActivity extends BaseActivity implements IView {
     private List<Method> mDataMethodList = new ArrayList<>();
     private List<BasePresenter> mInjectPresenters;
 

+ 1 - 1
mvp/src/main/java/com/miekir/mvp/view/BaseMVPFragment.java

@@ -21,7 +21,7 @@ import java.util.ArrayList;
 import java.util.List;
 
 
-public abstract class BaseMVPFragment extends BaseFragment implements IView {
+public abstract class OldBaseMVPFragment extends BaseFragment implements IView {
     /**
      * 是否被创建了
      */

+ 24 - 19
mvp/src/main/java/com/miekir/mvp/view/model/BaseMVPActivity.java

@@ -4,15 +4,14 @@ package com.miekir.mvp.view.model;
 import android.os.Bundle;
 import android.text.TextUtils;
 
+import androidx.lifecycle.MutableLiveData;
 import androidx.lifecycle.Observer;
 import androidx.lifecycle.ViewModelProvider;
 
 import com.miekir.mvp.base.BaseActivity;
 import com.miekir.mvp.base.DataResult;
-import com.miekir.mvp.presenter.BasePresenter;
 import com.miekir.mvp.presenter.BaseViewModel;
 import com.miekir.mvp.presenter.DataMethod;
-import com.miekir.mvp.presenter.InjectPresenter;
 import com.miekir.mvp.presenter.InjectViewModel;
 import com.miekir.mvp.view.IView;
 
@@ -22,15 +21,12 @@ import java.util.ArrayList;
 import java.util.List;
 
 /**
- * 利用反射,BaseMVPActivity将会查找子类中有{@link InjectPresenter}注解的成员变量,
- * 筛选出父类是{@link BasePresenter}的成员变量,对它们进行实例化
- * 然后BaseMVPActivity调用{@link BasePresenter}的一个方法把自身的{@link androidx.lifecycle.LiveData}类型引用
- * 传递给{@link BasePresenter},这样{@link BasePresenter}的子类就可以调用相应Activity的LiveData;
- *
+ * 基于MVP思想的Activity
+ * @author zhan
  */
-public abstract class BaseMVPActivity extends BaseActivity implements IView {
+public abstract class BaseMvpActivity extends BaseActivity implements IView {
     private List<Method> mDataMethodList = new ArrayList<>();
-    private List<BaseViewModel> mInjectPresenters;
+    private List<BaseViewModel> mInjectPresenters = new ArrayList<>();
 
     @Override
     protected void onCreate(Bundle savedInstanceState) {
@@ -45,8 +41,8 @@ public abstract class BaseMVPActivity extends BaseActivity implements IView {
      * 初始化添加注解的变量
      */
     private void initVariables() {
+        clearPresenters();
         // 这里可以获取到子类的成员变量
-        mInjectPresenters = new ArrayList<>();
         Field[] fields = this.getClass().getDeclaredFields();
         for (Field field : fields) {
             // 获取变量上面的注解类型
@@ -89,10 +85,8 @@ public abstract class BaseMVPActivity extends BaseActivity implements IView {
      * 初始化获取需要回调的注解方法
      */
     private void initCallbacks() {
-        // 查找回调方法(保证只添加一次)
-        if (mDataMethodList.size() != 0) {
-            return;
-        }
+        // 查找回调方法
+        mDataMethodList.clear();
 
         Method[] methods = null;
         try {
@@ -153,16 +147,27 @@ public abstract class BaseMVPActivity extends BaseActivity implements IView {
     @Override
     protected void onDestroy() {
         super.onDestroy();
-        if (mInjectPresenters != null && mInjectPresenters.size() > 0) {
+
+        clearPresenters();
+        mDataMethodList.clear();
+    }
+
+    private void clearPresenters() {
+        if (mInjectPresenters.size() > 0) {
             for (BaseViewModel presenter : mInjectPresenters) {
-                presenter.getLiveData().removeObservers(this);
+                if (presenter == null) {
+                    continue;
+                }
+
+                MutableLiveData<DataResult> liveData = presenter.getLiveData();
+                if (liveData == null) {
+                    continue;
+                }
+                liveData.removeObservers(this);
                 presenter.detachView();
             }
             mInjectPresenters.clear();
-            mInjectPresenters = null;
         }
-
-        mDataMethodList.clear();
     }
 
     /**

+ 25 - 7
mvp/src/main/java/com/miekir/mvp/view/model/BaseMVPFragment.java

@@ -6,6 +6,7 @@ import android.view.View;
 
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
+import androidx.lifecycle.MutableLiveData;
 import androidx.lifecycle.Observer;
 import androidx.lifecycle.ViewModelProvider;
 
@@ -27,7 +28,7 @@ import java.util.List;
 //    throw new AssertionError("第3个参数为" + objTypeName + "的方法有多个,应该合并为一个方法");
 //}
 //objectParamsList.add(objTypeName);
-public abstract class BaseMVPFragment extends BaseFragment implements IView {
+public abstract class BaseMvpFragment extends BaseFragment implements IView {
     /**
      * 是否被创建了
      */
@@ -38,7 +39,7 @@ public abstract class BaseMVPFragment extends BaseFragment implements IView {
     protected boolean isUIVisible;
 
     private List<Method> mDataMethodList = new ArrayList<>();
-    private List<BaseViewModel> mInjectPresenters;
+    private List<BaseViewModel> mInjectPresenters = new ArrayList<>();
 
     @Override
     public  void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
@@ -54,8 +55,8 @@ public abstract class BaseMVPFragment extends BaseFragment implements IView {
      * 初始化添加注解的变量
      */
     private void initVariables() {
+        clearPresenters();
         // 这里可以获取到子类的成员变量
-        mInjectPresenters = new ArrayList<>();
         Field[] fields = this.getClass().getDeclaredFields();
         for (Field field : fields) {
             // 获取变量上面的注解类型
@@ -98,10 +99,8 @@ public abstract class BaseMVPFragment extends BaseFragment implements IView {
      * 初始化获取需要回调的注解方法
      */
     private void initCallbacks() {
-        // 查找回调方法(保证只添加一次)
-        if (mDataMethodList.size() != 0) {
-            return;
-        }
+        // 查找回调方法
+        mDataMethodList.clear();
 
         Method[] methods = null;
         try {
@@ -202,10 +201,29 @@ public abstract class BaseMVPFragment extends BaseFragment implements IView {
             mInjectPresenters = null;
         }
 
+        clearPresenters();
         mDataMethodList.clear();
         //objectParamsList.clear();
     }
 
+    private void clearPresenters() {
+        if (mInjectPresenters.size() > 0) {
+            for (BaseViewModel presenter : mInjectPresenters) {
+                if (presenter == null) {
+                    continue;
+                }
+
+                MutableLiveData<DataResult> liveData = presenter.getLiveData();
+                if (liveData == null) {
+                    continue;
+                }
+                liveData.removeObservers(this);
+                presenter.detachView();
+            }
+            mInjectPresenters.clear();
+        }
+    }
+
     private void onDataResult(DataResult result) {
         dismissLoading();
         Class objParamClass = result.getBean().getClass();