詹子聪 5 роки тому
батько
коміт
fda38e0bd2

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

@@ -1,7 +1,6 @@
 package com.miekir.mvp.view;
 
 import android.os.Bundle;
-import android.util.Log;
 
 import androidx.lifecycle.MutableLiveData;
 import androidx.lifecycle.Observer;
@@ -13,7 +12,6 @@ import com.miekir.mvp.presenter.DataMethod;
 import com.miekir.mvp.presenter.InjectPresenter;
 
 import java.lang.reflect.Field;
-import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
 import java.util.ArrayList;
 import java.util.List;
@@ -30,14 +28,12 @@ import java.util.List;
  * 的泛型让getView方法返回具体的ILoginView,所以{@link BasePresenter}的子类还可以访问到ILoginView的特殊方法
  */
 public abstract class BaseMVPActivity extends BaseActivity implements IView {
-
     private List<Method> mDataMethodList = new ArrayList<>();
     private List<BasePresenter> mInjectPresenters;
 
     @Override
     protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
-        mInjectPresenters = new ArrayList<>();
 
         // 查找回调方法
         if (mDataMethodList.size() == 0) {
@@ -65,6 +61,7 @@ public abstract class BaseMVPActivity extends BaseActivity implements IView {
         }
 
         // 这里可以获取到子类的成员变量
+        mInjectPresenters = new ArrayList<>();
         Field[] fields = this.getClass().getDeclaredFields();
         for (Field field : fields) {
             //获取变量上面的注解类型
@@ -103,11 +100,14 @@ public abstract class BaseMVPActivity extends BaseActivity implements IView {
     @Override
     protected void onDestroy() {
         super.onDestroy();
-        for (BasePresenter presenter : mInjectPresenters) {
-            presenter.detachView();
+        if (mInjectPresenters != null && mInjectPresenters.size() > 0) {
+            for (BasePresenter presenter : mInjectPresenters) {
+                presenter.detachView();
+            }
+            mInjectPresenters.clear();
+            mInjectPresenters = null;
         }
-        mInjectPresenters.clear();
-        mInjectPresenters = null;
+
         mDataMethodList.clear();
     }
 

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

@@ -5,10 +5,13 @@ import android.os.Bundle;
 import androidx.annotation.Nullable;
 
 import com.miekir.mvp.base.BaseFragment;
+import com.miekir.mvp.base.DataResult;
 import com.miekir.mvp.presenter.BasePresenter;
+import com.miekir.mvp.presenter.DataMethod;
 import com.miekir.mvp.presenter.InjectPresenter;
 
 import java.lang.reflect.Field;
+import java.lang.reflect.Method;
 import java.util.ArrayList;
 import java.util.List;
 
@@ -23,12 +26,38 @@ public abstract class BaseMVPFragment extends BaseFragment implements IView {
      */
     protected boolean isUIVisible;
 
+    private List<Method> mDataMethodList = new ArrayList<>();
     private List<BasePresenter> mInjectPresenters;
 
     @Override
     public  void onCreateViewFinished(@Nullable Bundle savedInstanceState) {
         onViewInit();
 
+        // 查找回调方法
+        if (mDataMethodList.size() == 0) {
+            Method[] methods = null;
+            try {
+                // This is faster than getMethods, especially when subscribers are fat classes like Activities
+                methods = getClass().getDeclaredMethods();
+            } catch (Throwable th) {
+                // Workaround for java.lang.NoClassDefFoundError, see https://github.com/greenrobot/EventBus/issues/149
+                try {
+                    methods = getClass().getDeclaredMethods();
+                } catch (LinkageError error) { // super class of NoClassDefFoundError to be a bit more broad...
+                    error.printStackTrace();
+                }
+            }
+
+            if (methods != null && methods.length > 0) {
+                for (Method method : methods) {
+                    DataMethod dataMethod = method.getAnnotation(DataMethod.class);
+                    if (dataMethod != null) {
+                        mDataMethodList.add(method);
+                    }
+                }
+            }
+        }
+
         mInjectPresenters = new ArrayList<>();
         Field[] fields = this.getClass().getDeclaredFields();
         for (Field field : fields) {
@@ -99,5 +128,17 @@ public abstract class BaseMVPFragment extends BaseFragment implements IView {
             mInjectPresenters.clear();
             mInjectPresenters = null;
         }
+
+        mDataMethodList.clear();
+    }
+
+    public void onDataResult(DataResult result) {
+        for (Method method : mDataMethodList) {
+            try {
+                method.invoke(this, result.getCode(), result.getMessage(), result.getBean());
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
+        }
     }
 }