詹子聪 5 éve
szülő
commit
c0cd25ec10

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

@@ -6,6 +6,7 @@ import android.util.Log;
 import android.view.View;
 
 import com.miekir.mvp.base.DataResult;
+import com.miekir.mvp.presenter.DataMethod;
 import com.miekir.mvp.presenter.InjectPresenter;
 import com.miekir.mvp.view.BaseMVPActivity;
 
@@ -34,10 +35,15 @@ public class MainActivity extends BaseMVPActivity {
         });
     }
 
-    @Override
-    public void onDataResult(DataResult result) {
-        DataResult<TestBean1> dataResult = result;
-        Log.e("data_result", "name: " + dataResult.getBean().getName());
 
+    // todo 检查该注解的参数个数,不是3个就抛出异常
+    @DataMethod
+    public void onDataCome1(int code, String msg, TestBean1 data) {
+        Log.e("ttttt", data.getName());
+    }
+
+    @DataMethod
+    public void onDataCome2(int code, String msg, TestBean2 data) {
+        Log.e("ttttt", data.getName());
     }
 }

+ 15 - 0
mvp/src/main/java/com/miekir/mvp/presenter/DataMethod.java

@@ -0,0 +1,15 @@
+package com.miekir.mvp.presenter;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * @description 方法回调标记
+ * @date 2019/8/19
+ */
+@Retention(RetentionPolicy.RUNTIME)
+@Target(ElementType.METHOD)
+public @interface DataMethod {
+}

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

@@ -1,6 +1,7 @@
 package com.miekir.mvp.view;
 
 import android.os.Bundle;
+import android.util.Log;
 
 import androidx.lifecycle.MutableLiveData;
 import androidx.lifecycle.Observer;
@@ -8,9 +9,12 @@ import androidx.lifecycle.Observer;
 import com.miekir.mvp.base.BaseActivity;
 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.InvocationTargetException;
+import java.lang.reflect.Method;
 import java.util.ArrayList;
 import java.util.List;
 
@@ -27,6 +31,7 @@ import java.util.List;
  */
 public abstract class BaseMVPActivity extends BaseActivity implements IView {
 
+    private List<Method> mDataMethodList = new ArrayList<>();
     private List<BasePresenter> mInjectPresenters;
 
     @Override
@@ -34,6 +39,31 @@ public abstract class BaseMVPActivity extends BaseActivity implements IView {
         super.onCreate(savedInstanceState);
         mInjectPresenters = new ArrayList<>();
 
+        // 查找回调方法
+        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);
+                    }
+                }
+            }
+        }
+
         // 这里可以获取到子类的成员变量
         Field[] fields = this.getClass().getDeclaredFields();
         for (Field field : fields) {
@@ -62,7 +92,7 @@ public abstract class BaseMVPActivity extends BaseActivity implements IView {
                     e.printStackTrace();
                 } catch (InstantiationException e) {
                     e.printStackTrace();
-                }catch (ClassCastException e){
+                } catch (ClassCastException e) {
                     e.printStackTrace();
                     throw new RuntimeException("SubClass must extends Class:BasePresenter");
                 }
@@ -78,9 +108,17 @@ public abstract class BaseMVPActivity extends BaseActivity implements IView {
         }
         mInjectPresenters.clear();
         mInjectPresenters = null;
+        mDataMethodList.clear();
     }
 
 
-    public abstract void onDataResult(DataResult result);
-
+    public void onDataResult(DataResult result) {
+        for (Method method : mDataMethodList) {
+            try {
+                method.invoke(this, result.getCode(), result.getMessage(), result.getBean());
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
+        }
+    }
 }