Przeglądaj źródła

剩余如何推送到具体方法

詹子聪 5 lat temu
rodzic
commit
f32595a3cb

+ 7 - 7
mvp/src/main/java/com/miekir/mvp/bean/DataResult.java

@@ -11,13 +11,13 @@ public class DataResult {
     private int responseCode;
     private String message;
     private Object bean;
-    private int sourceCode;
+    private int dataSource;
 
-    public DataResult(int responseCode, String message, Object bean, int sourceCode) {
+    public DataResult(int responseCode, String message, Object bean, int dataSource) {
         this.responseCode = responseCode;
         this.message = message;
         this.bean = bean;
-        this.sourceCode = sourceCode;
+        this.dataSource = dataSource;
     }
 
     public int getResponseCode() {
@@ -44,11 +44,11 @@ public class DataResult {
         this.bean = bean;
     }
 
-    public int getSourceCode() {
-        return sourceCode;
+    public int getDataSource() {
+        return dataSource;
     }
 
-    public void setSourceCode(int sourceCode) {
-        this.sourceCode = sourceCode;
+    public void setDataSource(int dataSource) {
+        this.dataSource = dataSource;
     }
 }

+ 14 - 176
mvp/src/main/java/com/miekir/mvp/view/BaseMvpFragment.java

@@ -11,13 +11,8 @@ import androidx.lifecycle.Observer;
 
 import com.miekir.mvp.base.BaseFragment;
 import com.miekir.mvp.bean.DataResult;
-import com.miekir.mvp.constant.BaseMvpResponse;
-import com.miekir.mvp.constant.BaseMvpSource;
-import com.miekir.mvp.presenter.BaseViewModel;
-import com.miekir.mvp.presenter.DataMethod;
-import com.miekir.mvp.presenter.InjectViewModel;
+import com.miekir.mvp.presenter.BasePresenter;
 
-import java.lang.reflect.Field;
 import java.lang.reflect.Method;
 import java.util.ArrayList;
 import java.util.List;
@@ -39,9 +34,10 @@ public abstract class BaseMvpFragment extends BaseFragment implements IView {
     protected boolean isUIVisible;
 
     private List<Method> mDataMethodList = new ArrayList<>();
-    private List<BaseViewModel> mInjectPresenters = new ArrayList<>();
+    private List<BasePresenter> mInjectPresenters = new ArrayList<>();
 
     private volatile int mLoadingNum;
+    @Override
     public synchronized int onLoadTimeChange(boolean isAdd, String message) {
         if (isAdd) {
             mLoadingNum = mLoadingNum +1;
@@ -61,138 +57,22 @@ public abstract class BaseMvpFragment extends BaseFragment implements IView {
     @Override
     public void onTaskCancel() {
         mLoadingNum = 0;
-        for (BaseViewModel viewModel : mInjectPresenters) {
+        for (BasePresenter viewModel : mInjectPresenters) {
             viewModel.onTaskCancel();
         }
     }
 
     @Override
     public  void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
-        initVariables();
-        initCallbacks();
+        ViewHelper.initVariables(mInjectPresenters, this, this);
+        ViewHelper.initCallbacks(mDataMethodList, getClass());
 
         isViewCreated = true;
         onViewInit();
         loadData();
     }
 
-    /**
-     * 初始化添加注解的变量
-     */
-    private void initVariables() {
-        clearPresenters();
-        // 这里可以获取到子类的成员变量
-        Field[] fields = this.getClass().getDeclaredFields();
-        for (Field field : fields) {
-            // 获取变量上面的注解类型
-            InjectViewModel injectViewModel = field.getAnnotation(InjectViewModel.class);
-            if (injectViewModel == null) {
-                continue;
-            }
-
-            try {
-                field.setAccessible(true);
-
-                // 父类引用指向子类对象
-                Class<? extends BaseViewModel> type = (Class<? extends BaseViewModel>) field.getType();
-                BaseViewModel presenter = type.newInstance();
-                // 下面这种方法是单例形式,会造成重复回调的问题
-                //BaseViewModel presenter = new ViewModelProvider(this).get(type);
-
-                // 创建一个观察者去更新UI
-                final Observer<DataResult> observer = new Observer<DataResult>() {
-                    @Override
-                    public void onChanged(final DataResult result) {
-                        // 回调是在主线程
-                        // Log.i("Thread", String.valueOf(Thread.currentThread() == Looper.getMainLooper().getThread()));
-                        if (result.getSourceCode() == BaseMvpSource.DIALOG_SHOW) {
-                            onLoadTimeChange(true, result.getMessage());
-                        } else if (result.getSourceCode() == BaseMvpSource.DIALOG_DISMISS) {
-                            onLoadTimeChange(false, result.getMessage());
-                        } else {
-                            onDataResult(result);
-                        }
-                    }
-                };
-                if (injectViewModel.isPersist()) {
-                    presenter.getLiveData().observeForever(observer);
-                } else {
-                    presenter.getLiveData().observe(this, observer);
-                }
-
-                field.set(this, presenter);
-                mInjectPresenters.add(presenter);
-            } catch (IllegalAccessException | java.lang.InstantiationException e) {
-                e.printStackTrace();
-            } catch (ClassCastException e) {
-                e.printStackTrace();
-                throw new RuntimeException(InjectViewModel.class.getName() + "注解修饰的类必须继承自:" + BaseViewModel.class.getName());
-            }
-        }
-    }
-
-    /**
-     * 初始化获取需要回调的注解方法
-     */
-    private void initCallbacks() {
-        // 查找回调方法
-        mDataMethodList.clear();
-
-        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().getMethods();
-            } catch (LinkageError error) {
-                error.printStackTrace();
-            }
-        }
-
-        // 参数校验
-        if (methods == null || methods.length == 0) {
-            return;
-        }
-
-        String methodAnnotationName = DataMethod.class.getName();
-        for (Method method : methods) {
-            DataMethod dataMethod = method.getAnnotation(DataMethod.class);
-            if (dataMethod == null) {
-                continue;
-            }
 
-            int length = method.getParameterTypes().length;
-            if (length != 4) {
-                throw new AssertionError(methodAnnotationName + "修饰的方法参数数量必须为4个");
-            }
-
-            // 响应结果code
-            String firstType = method.getParameterTypes()[0].getSimpleName();
-            String resultCodeType = int.class.getSimpleName();
-            if (!TextUtils.equals(resultCodeType, firstType)) {
-                throw new AssertionError(methodAnnotationName + "修饰的方法第1个参数必须为" + resultCodeType);
-            }
-
-            // 响应消息
-            String secondType = method.getParameterTypes()[1].getSimpleName();
-            String messageType = String.class.getSimpleName();
-            if (!TextUtils.equals(messageType, secondType)) {
-                throw new AssertionError(methodAnnotationName + "修饰的方法第2个参数必须为" + messageType);
-            }
-
-            // 数据来源
-            String fourthType = method.getParameterTypes()[3].getSimpleName();
-            String sourceCodeType = int.class.getSimpleName();
-            if (!TextUtils.equals(fourthType, sourceCodeType)) {
-                throw new AssertionError(methodAnnotationName + "修饰的方法第4个参数必须为" + sourceCodeType);
-            }
-
-            method.setAccessible(true);
-            mDataMethodList.add(method);
-        }
-    }
 
     /**
      * View初始化
@@ -228,58 +108,16 @@ public abstract class BaseMvpFragment extends BaseFragment implements IView {
     @Override
     public void onDestroyView() {
         super.onDestroyView();
-        if (mInjectPresenters != null && mInjectPresenters.size() > 0) {
-            for (BaseViewModel presenter : mInjectPresenters) {
-                presenter.getLiveData().removeObservers(this);
-                presenter.detachView();
-            }
-            mInjectPresenters.clear();
-            mInjectPresenters = null;
-        }
-
-        clearPresenters();
+        ViewHelper.clearPresenters(mInjectPresenters, this);
         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) {
-        Class objParamClass = result.getBean().getClass();
-        for (Method method : mDataMethodList) {
-            Class methodParamClass = method.getParameterTypes()[2];
-            // 判断方法的第二个参数类型是否是回调对象的父类
-            if (!methodParamClass.isAssignableFrom(objParamClass)) {
-                continue;
-            }
-
-            try {
-                method.invoke(this, result.getResponseCode(), result.getMessage(), result.getBean(), result.getSourceCode());
-            } catch (Exception e) {
-                e.printStackTrace();
-            }
-
-            try {
-                method.invoke(this, result.getResponseCode() == BaseMvpResponse.COMMON_SUCCESS, result.getMessage(), result.getBean(), result.getSourceCode());
-            } catch (Exception e) {
-                e.printStackTrace();
-            }
-        }
+    /**
+     * 回调
+     * @param result
+     */
+    @Override
+    public void onDataResult(DataResult result) {
+        ViewHelper.handleDataResult(this, mDataMethodList, result);
     }
 }

+ 4 - 5
mvp/src/main/java/com/miekir/mvp/view/ViewHelper.java

@@ -6,7 +6,6 @@ import androidx.lifecycle.LifecycleOwner;
 import androidx.lifecycle.MutableLiveData;
 import androidx.lifecycle.Observer;
 
-import com.miekir.mvp.base.BaseActivity;
 import com.miekir.mvp.bean.DataResult;
 import com.miekir.mvp.constant.BaseMvpResponse;
 import com.miekir.mvp.model.DataSource;
@@ -58,7 +57,7 @@ public class ViewHelper {
     /**
      * 初始化获取需要回调的注解方法
      */
-    public static void initCallbacks(List<Method> mDataMethodList, Class<? extends BaseActivity> getClass) {
+    public static void initCallbacks(List<Method> mDataMethodList, Class<?> getClass) {
         // 查找回调方法
         mDataMethodList.clear();
 
@@ -149,9 +148,9 @@ public class ViewHelper {
                 final Observer<DataResult> dialogObserver = new Observer<DataResult>() {
                     @Override
                     public void onChanged(final DataResult result) {
-                        if (result.getSourceCode() == DialogAction.DIALOG_SHOW) {
+                        if (result.getDataSource() == DialogAction.DIALOG_SHOW) {
                             iView.onLoadTimeChange(true, result.getMessage());
-                        } else if (result.getSourceCode() == DialogAction.DIALOG_DISMISS) {
+                        } else if (result.getDataSource() == DialogAction.DIALOG_DISMISS) {
                             iView.onLoadTimeChange(false, result.getMessage());
                         }
                     }
@@ -195,7 +194,7 @@ public class ViewHelper {
             if (dataMethod != null) {
                 dataSource = dataMethod.dataSource();
             }
-            if (dataSource != result.getSourceCode()) {
+            if (dataSource != result.getDataSource()) {
                 continue;
             }