詹子聪 5 vuotta sitten
vanhempi
commit
aa22a0611a

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

@@ -4,19 +4,14 @@ import android.content.Intent;
 import android.os.Bundle;
 import android.view.View;
 import android.widget.TextView;
-import android.widget.Toast;
 
-import com.miekir.mvp.bean.DataResult;
-import com.miekir.mvp.jetpack.BaseObserver;
-import com.miekir.mvp.jetpack.WrapLiveData;
 import com.miekir.mvp.presenter.InjectPresenter;
 import com.miekir.mvp.view.BaseMvpActivity;
 
-import java.util.List;
-
 public class MainActivity extends BaseMvpActivity implements View.OnClickListener {
+
     @InjectPresenter
-    TestPresenter presenter;
+    MainPresenter presenter;
 
     @Override
     public int getLayoutID() {
@@ -44,22 +39,7 @@ public class MainActivity extends BaseMvpActivity implements View.OnClickListene
         switch (v.getId()) {
             case R.id.view_test:
                 // 点击之后,后台执行耗时操作
-                WrapLiveData<List<TestBean1>> liveData = presenter.<List<TestBean1>>getWrapperLiveData(true)
-                        .observeOnce(new BaseObserver<DataResult<List<TestBean1>>>() {
-                            @Override
-                            public void onDataChanged(DataResult<List<TestBean1>> listDataResult) {
-                                Toast.makeText(getApplicationContext(), listDataResult.getBean().get(0).getName(), Toast.LENGTH_SHORT).show();
-                            }
-                        });
-                presenter.goWithWrapper(liveData);
-
-//                RawLiveData<List<TestBean1>> liveData = presenter.<List<TestBean1>>getRawLiveData(true).observeOnce(new BaseObserver<List<TestBean1>>() {
-//                    @Override
-//                    public void onDataChanged(List<TestBean1> testBean1s) {
-//                        Toast.makeText(getApplicationContext(), testBean1s.get(0).getName(), Toast.LENGTH_SHORT).show();
-//                    }
-//                });
-//                presenter.goWithoutWrap(liveData);
+                startActivity(new Intent(this, MainActivity.class));
                 break;
             default:
                 break;

+ 18 - 0
app/src/main/java/com/miekir/newmvp/MainPresenter.java

@@ -0,0 +1,18 @@
+package com.miekir.newmvp;
+
+import com.miekir.mvp.presenter.BasePresenter;
+import com.miekir.mvp.view.IView;
+
+/**
+ * Copyright (C), 2019-2020, Miekir
+ *
+ * @author Miekir
+ * @date 2020/11/18 14:27
+ * Description:
+ */
+public class MainPresenter extends BasePresenter<IView> {
+    @Override
+    public void onTaskCancel() {
+
+    }
+}

+ 0 - 77
app/src/main/java/com/miekir/newmvp/TestPresenter.java

@@ -1,77 +0,0 @@
-package com.miekir.newmvp;
-
-import android.util.Log;
-
-import com.miekir.mvp.jetpack.RawLiveData;
-import com.miekir.mvp.jetpack.WrapLiveData;
-import com.miekir.mvp.presenter.BasePresenter;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * Copyright (C), 2019-2020, Miekir
- *
- * @author Miekir
- * @date 2020/10/6 20:53
- * Description:注意ViewModel的类必须是public的,否则无法创建实例
- */
-public class TestPresenter extends BasePresenter {
-
-    @Override
-    public void init() {
-
-    }
-
-
-    public Thread goWithWrapper(final WrapLiveData<List<TestBean1>> liveData) {
-        Thread thread = new Thread(new Runnable() {
-            @Override
-            public void run() {
-                try {
-                    for (int i = 0; i < 20; i++) {
-                        Thread.sleep(1000);
-                        Log.i("test", "io thread..." + i);
-                    }
-
-                    TestBean1 bean = new TestBean1(3, "ViewModel Jason");
-                    List<TestBean1> list = new ArrayList<>();
-                    list.add(bean);
-                    liveData.postSuccess(list);
-                } catch (Exception e) {
-                    e.printStackTrace();
-                }
-            }
-        });
-        thread.start();
-        return thread;
-    }
-
-    public Thread goWithoutWrap(final RawLiveData<List<TestBean1>> liveData) {
-        Thread thread = new Thread(new Runnable() {
-            @Override
-            public void run() {
-                try {
-                    for (int i = 0; i < 20; i++) {
-                        Thread.sleep(1000);
-                        Log.i("test", "io thread..." + i);
-                    }
-
-                    TestBean1 bean = new TestBean1(3, "ViewModel Jason");
-                    List<TestBean1> list = new ArrayList<>();
-                    list.add(bean);
-                    liveData.post(list);
-                } catch (Exception e) {
-                    e.printStackTrace();
-                }
-            }
-        });
-        thread.start();
-        return thread;
-    }
-
-    @Override
-    public void onTaskCancel() {
-        super.onTaskCancel();
-    }
-}

+ 7 - 7
common/build.gradle

@@ -36,13 +36,13 @@ dependencies {
     androidTestImplementation 'androidx.test.ext:junit:1.1.1'
     androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
 
-    api "androidx.core:core:1.4.0-alpha01"
-    api 'androidx.appcompat:appcompat:1.3.0-alpha01'
-    api 'com.google.android.material:material:1.1.0'
-    api 'androidx.vectordrawable:vectordrawable:1.1.0'
-    api 'androidx.navigation:navigation-fragment:2.2.2'
-    api 'androidx.navigation:navigation-ui:2.2.2'
-    api 'androidx.lifecycle:lifecycle-extensions:2.2.0'
+    //api "androidx.core:core:1.5.0-alpha05"
+    //api 'androidx.appcompat:appcompat:1.3.0-alpha02'
+    //api 'com.google.android.material:material:1.2.1'
+    //api 'androidx.vectordrawable:vectordrawable:1.1.0'
+    //api 'androidx.navigation:navigation-fragment:2.3.1'
+    //api 'androidx.navigation:navigation-ui:2.3.1'
+    //api 'androidx.lifecycle:lifecycle-extensions:2.2.0'
 
     // 带行号的Log
     api 'com.github.zhaokaiqiang.klog:library:1.6.0'

+ 6 - 2
mvp/build.gradle

@@ -27,13 +27,17 @@ android {
 dependencies {
     implementation fileTree(dir: 'libs', include: ['*.jar'])
 
-    compile 'androidx.appcompat:appcompat:1.3.0-alpha01'
+    compile 'androidx.appcompat:appcompat:1.3.0-alpha02'
     testImplementation 'junit:junit:4.12'
     androidTestImplementation 'androidx.test.ext:junit:1.1.1'
     androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
 
     def lifecycle_version = "2.2.0"
-    implementation "androidx.lifecycle:lifecycle-livedata-ktx:$lifecycle_version"
+    //implementation "androidx.lifecycle:lifecycle-livedata-ktx:$lifecycle_version"
     implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:$lifecycle_version"
     implementation 'androidx.lifecycle:lifecycle-extensions:2.2.0'
+
+    //def activity_version = "1.1.0"
+    def activity_version = "1.2.0-beta01"
+    implementation "androidx.activity:activity:$activity_version"
 }

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

@@ -46,7 +46,6 @@ public abstract class BaseActivity extends AppCompatActivity {
 
         //进入页面隐藏输入框
         getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN);
-        //mBinder = ButterKnife.bind(this);
         mLoadingDialog = new LoadingDialog(this);
         mLoadingDialog.setCancelListener(new LoadingDialog.OnLoadingCancelListener() {
             @Override
@@ -85,7 +84,6 @@ public abstract class BaseActivity extends AppCompatActivity {
     @Override
     protected void onDestroy() {
         super.onDestroy();
-        //mBinder.unbind();
         dismissLoading();
         getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN);
     }

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

@@ -1,67 +0,0 @@
-package com.miekir.mvp.bean;
-
-import com.miekir.mvp.constant.MvpResponse;
-import com.miekir.mvp.model.DataSource;
-
-/**
- * Copyright (C), 2019-2020, Miekir
- *
- * @author Miekir
- * @date 2020/10/6 21:30
- * Description:
- */
-public class DataResult<D> {
-    private int responseCode;
-    private String message;
-    private D bean;
-    private int dataSource = DataSource.DEFAULT;
-
-    public DataResult(int responseCode, String message, D bean) {
-        this.responseCode = responseCode;
-        this.message = message;
-        this.bean = bean;
-    }
-
-    public DataResult(int responseCode, String message, D bean, int dataSource) {
-        this.responseCode = responseCode;
-        this.message = message;
-        this.bean = bean;
-        this.dataSource = dataSource;
-    }
-
-    public int getResponseCode() {
-        return responseCode;
-    }
-
-    public void setResponseCode(int responseCode) {
-        this.responseCode = responseCode;
-    }
-
-    public String getMessage() {
-        return message;
-    }
-
-    public void setMessage(String message) {
-        this.message = message;
-    }
-
-    public D getBean() {
-        return bean;
-    }
-
-    public void setBean(D bean) {
-        this.bean = bean;
-    }
-
-    public boolean isSuccess() {
-        return responseCode == MvpResponse.SUCCESS;
-    }
-
-    public int getDataSource() {
-        return dataSource;
-    }
-
-    public void setDataSource(int dataSource) {
-        this.dataSource = dataSource;
-    }
-}

+ 0 - 14
mvp/src/main/java/com/miekir/mvp/constant/DialogAction.java

@@ -1,14 +0,0 @@
-package com.miekir.mvp.constant;
-
-/**
- * Copyright (C), 2019-2020, Miekir
- *
- * @author Miekir
- * @date 2020/10/30 9:00
- * Description: 用于区分数据来源。如一个界面上有两个列表,左边是展示本地数据库的数据,右边是展示远程数据库的数据,数据类型一样,
- * 此时有必要区分来源。
- */
-public interface DialogAction {
-    int DIALOG_SHOW = 1;
-    int DIALOG_DISMISS = -1;
-}

+ 0 - 13
mvp/src/main/java/com/miekir/mvp/constant/MvpResponse.java

@@ -1,13 +0,0 @@
-package com.miekir.mvp.constant;
-
-/**
- * Copyright (C), 2019-2020, Miekir
- *
- * @author Miekir
- * @date 2020/10/30 9:10
- * Description:
- */
-public interface MvpResponse {
-    int SUCCESS = 0;
-    int FAIL = -1;
-}

+ 0 - 32
mvp/src/main/java/com/miekir/mvp/jetpack/BaseObserver.java

@@ -1,32 +0,0 @@
-package com.miekir.mvp.jetpack;
-
-
-import androidx.lifecycle.Observer;
-
-/**
- * Copyright (C), 2019-2020, Miekir
- * @author Miekir
- * @date 2020/11/14 20:51
- * Description:
- * @param <T> 监听者里面的数据类型
- */
-public abstract class BaseObserver<T> implements Observer<T> {
-    private RawLiveData<T> liveData;
-    public void setLiveData(RawLiveData<T> liveData) {
-        this.liveData = liveData;
-    }
-
-    /**
-     * 数据发生改变,被观察者观察到
-     * @param t 发生变化的数据
-     */
-    public abstract void onDataChanged(T t);
-
-    @Override
-    public void onChanged(T t) {
-        if (liveData != null) {
-            liveData.cancelObserve();
-            onDataChanged(t);
-        }
-    }
-}

+ 0 - 69
mvp/src/main/java/com/miekir/mvp/jetpack/RawLiveData.java

@@ -1,69 +0,0 @@
-package com.miekir.mvp.jetpack;
-
-import androidx.lifecycle.MutableLiveData;
-
-import com.miekir.mvp.presenter.BasePresenter;
-
-//得到一个LiveData,用于传递Observer参数的形式,这里暂时用不到
-//private <T> MutableLiveData<T> observeOnce(final Observer<T> observer) {
-//final MutableLiveData<T> specificLiveData = new MutableLiveData<>();
-//        specificLiveData.observeForever(new Observer<T>() {
-//@Override
-//public void onChanged(T t) {
-//specificLiveData.removeObserver(this);
-//observer.onChanged(t);
-//}
-//});
-//return specificLiveData;
-//}
-/**
- * Copyright (C), 2019-2020, Miekir
- *
- * @author Miekir
- * @date 2020/11/14 20:45
- * Description:
- * @param <T> 监听者里面的数据类型
- */
-public class RawLiveData<T> extends MutableLiveData<T> {
-    protected BasePresenter mPresenter;
-    protected boolean mWidthProgress;
-    public RawLiveData(BasePresenter mPresenter, boolean withProgress) {
-        this.mPresenter = mPresenter;
-        this.mWidthProgress = withProgress;
-    }
-
-    protected BaseObserver<T> mObserver;
-    public void cancelObserve() {
-        if (mObserver == null) {
-            return;
-        }
-        mPresenter.getLiveDataList().remove(this);
-        mObserver.setLiveData(null);
-        removeObserver(mObserver);
-        mObserver = null;
-        mPresenter = null;
-    }
-
-    /**
-     * 只监听一次的LiveData
-     * @param observer
-     */
-    public RawLiveData<T> observeOnce(BaseObserver<T> observer) {
-        mObserver = observer;
-        observer.setLiveData(this);
-        observeForever(observer);
-        return this;
-    }
-
-    public void post(T dataBean) {
-        if (mPresenter == null) {
-            return;
-        }
-
-        if (mWidthProgress) {
-            mPresenter.dismissLoading();
-        }
-
-        postValue(dataBean);
-    }
-}

+ 0 - 49
mvp/src/main/java/com/miekir/mvp/jetpack/WrapLiveData.java

@@ -1,49 +0,0 @@
-package com.miekir.mvp.jetpack;
-
-import com.miekir.mvp.bean.DataResult;
-import com.miekir.mvp.constant.MvpResponse;
-import com.miekir.mvp.presenter.BasePresenter;
-
-/**
- * Copyright (C), 2019-2020, Miekir
- *
- * @author Miekir
- * @date 2020/11/14 21:36
- * Description:
- * @param <T> 监听者里面的数据类型
- */
-public class WrapLiveData<T> extends RawLiveData<DataResult<T>> {
-    public WrapLiveData(BasePresenter mPresenter, boolean withProgress) {
-        super(mPresenter, withProgress);
-    }
-
-    @Override
-    public WrapLiveData<T> observeOnce(BaseObserver<DataResult<T>> observer) {
-        mObserver = observer;
-        observer.setLiveData(this);
-        observeForever(observer);
-        return this;
-    }
-
-    public void post(int responseCode, String message, T dataBean) {
-        if (mPresenter == null) {
-            return;
-        }
-
-        if (mWidthProgress) {
-            mPresenter.dismissLoading();
-        }
-
-        mPresenter.getLiveDataList().remove(this);
-        postValue(new DataResult<T>(responseCode, message, dataBean));
-    }
-
-    public void postSuccess(T dataBean) {
-        post(MvpResponse.SUCCESS, "", dataBean);
-    }
-
-    public void postFail(String message) {
-        post(MvpResponse.FAIL, message, null);
-    }
-
-}

+ 0 - 68
mvp/src/main/java/com/miekir/mvp/jetpack/backup/RawLiveData.java

@@ -1,68 +0,0 @@
-package com.miekir.mvp.jetpack.backup;
-
-//得到一个LiveData,用于传递Observer参数的形式,这里暂时用不到
-//private <T> MutableLiveData<T> observeOnce(final Observer<T> observer) {
-//final MutableLiveData<T> specificLiveData = new MutableLiveData<>();
-//        specificLiveData.observeForever(new Observer<T>() {
-//@Override
-//public void onChanged(T t) {
-//specificLiveData.removeObserver(this);
-//observer.onChanged(t);
-//}
-//});
-//return specificLiveData;
-//}
-
-/**
- * Copyright (C), 2019-2020, Miekir
- *
- * @author Miekir
- * @date 2020/11/14 20:45
- * Description:
- * @param <T> 监听者里面的数据类型
- * @param <C> 返回的任务,是可取消的类型,一般定义为Void即可,除非要在Activity上执行特定操作取消某个特定任务
- */
-//public class RawLiveData<T, C> extends MutableLiveData<T> {
-//    protected BasePresenter mPresenter;
-//    protected boolean mWidthProgress;
-//    public RawLiveData(BasePresenter mPresenter, boolean withProgress) {
-//        this.mPresenter = mPresenter;
-//        this.mWidthProgress = withProgress;
-//    }
-//
-//    private ResultObserver<T, C> mObserver;
-//    public void cancelObserve() {
-//        mObserver.setLiveData(null);
-//        removeObserver(mObserver);
-//        mObserver = null;
-//        mPresenter = null;
-//    }
-//
-//    private C mTask;
-//    public void setCancelableTask(C cancelableTask) {
-//        mTask = cancelableTask;
-//    }
-//    /**
-//     * 只监听一次的LiveData
-//     * @param observer
-//     */
-//    public C observeOnce(ResultObserver<T, C> observer) {
-//        mObserver = observer;
-//        observer.setLiveData(this);
-//        observeForever(observer);
-//        return mTask;
-//    }
-//
-//    public void post(T dataBean) {
-//        if (mPresenter == null) {
-//            return;
-//        }
-//
-//        if (mWidthProgress) {
-//            mPresenter.dismissLoading();
-//        }
-//
-//        mPresenter.getLiveDataList().remove(this);
-//        postValue(dataBean);
-//    }
-//}

+ 0 - 38
mvp/src/main/java/com/miekir/mvp/jetpack/backup/WrapLiveData.java

@@ -1,38 +0,0 @@
-package com.miekir.mvp.jetpack.backup;
-
-/**
- * Copyright (C), 2019-2020, Miekir
- *
- * @author Miekir
- * @date 2020/11/14 21:36
- * Description:
- * @param <T> 监听者里面的数据类型
- * @param <C> 返回的任务,是可取消的类型,一般定义为Void即可,除非要在Activity上执行特定操作取消某个特定任务
- */
-//public class WrapLiveData<T, C> extends RawLiveData<DataResult<T>, C> {
-//    public WrapLiveData(BasePresenter mPresenter, boolean withProgress) {
-//        super(mPresenter, withProgress);
-//    }
-//
-//    public void post(int responseCode, String message, T dataBean) {
-//        if (mPresenter == null) {
-//            return;
-//        }
-//
-//        if (mWidthProgress) {
-//            mPresenter.dismissLoading();
-//        }
-//
-//        mPresenter.getLiveDataList().remove(this);
-//        postValue(new DataResult<T>(responseCode, message, dataBean));
-//    }
-//
-//    public void postSuccess(T dataBean) {
-//        post(MvpResponse.SUCCESS, "", dataBean);
-//    }
-//
-//    public void postFail(String message) {
-//        post(MvpResponse.FAIL, message, null);
-//    }
-//
-//}

+ 22 - 84
mvp/src/main/java/com/miekir/mvp/presenter/BasePresenter.java

@@ -1,15 +1,12 @@
 package com.miekir.mvp.presenter;
 
-import androidx.lifecycle.MutableLiveData;
+import android.util.Log;
+
 import androidx.lifecycle.ViewModel;
 
-import com.miekir.mvp.bean.DataResult;
-import com.miekir.mvp.constant.DialogAction;
-import com.miekir.mvp.jetpack.RawLiveData;
-import com.miekir.mvp.jetpack.WrapLiveData;
+import com.miekir.mvp.view.IView;
 
-import java.util.List;
-import java.util.concurrent.CopyOnWriteArrayList;
+import java.lang.ref.WeakReference;
 
 /**
  * Copyright (C), 2019-2020, Miekir
@@ -18,97 +15,38 @@ import java.util.concurrent.CopyOnWriteArrayList;
  * @date 2020/10/7 22:46
  * Description:
  */
-public abstract class BasePresenter extends ViewModel {
-    //private ThreadLocal<Integer> mThreadLocal = new ThreadLocal<>();
-    /**
-     * ViewModel的生命周期和Activity保持一致;在onStart()、onResume()、onPause()时调用LiveData的setValue才会通知观察者
-     * liveData在ViewModel(Presenter)创建,然后提供方法给Activity获取,方便取消观察
-     */
-    private MutableLiveData<DataResult<?>> commonLiveData = new MutableLiveData<>();
-    private MutableLiveData<DataResult<?>> dialogLiveData = new MutableLiveData<>();
-    public MutableLiveData<DataResult<?>> getCommonLiveData() {
-        return commonLiveData;
-    }
-    public MutableLiveData<DataResult<?>> getDialogLiveData() {
-        return dialogLiveData;
-    }
-
-    private List<RawLiveData<?>> liveDataList = new CopyOnWriteArrayList<>();
-    public List<RawLiveData<?>> getLiveDataList() {
-        return liveDataList;
-    }
-
-    /**
-     * 返回带有结果状态的实体
-     * @param withProgress 是否显示加载对话框
-     * @param <T> 监听者里面的数据类型
-     */
-    public <T> WrapLiveData<T> getWrapperLiveData(boolean withProgress) {
-        if (withProgress) {
-            showLoading();
-        }
-        WrapLiveData<T> liveData = new WrapLiveData<>(this, withProgress);
-        liveDataList.add(liveData);
-        return liveData;
-    }
-    public <T> RawLiveData<T> getRawLiveData(boolean withProgress) {
-        if (withProgress) {
-            showLoading();
-        }
-        RawLiveData<T> liveData = new RawLiveData<>(this, withProgress);
-        liveDataList.add(liveData);
-        return liveData;
-    }
+public abstract class BasePresenter<V extends IView> extends ViewModel {
+    private WeakReference<V> wrf;
 
-    /**
-     * 显示默认文字的进度框
-     */
-    public void showLoading() {
-        showLoading("");
+    public V getView() {
+        return wrf == null ? null : wrf.get();
     }
 
-    /**
-     * 显示带有具体文字提示的进度对话框
-     * @param message 具体文字提示
-     */
-    public void showLoading(String message) {
-        if (dialogLiveData == null) {
-            return;
-        }
-        dialogLiveData.postValue(new DataResult(0, message, null, DialogAction.DIALOG_SHOW));
+    public void attachView(V view) {
+        wrf = new WeakReference<V>(view);
     }
 
-    /**
-     * 让进度对话框消失
-     */
-    public void dismissLoading() {
-        if (dialogLiveData == null) {
-            return;
-        }
-        dialogLiveData.postValue(new DataResult(0, null, null, DialogAction.DIALOG_DISMISS));
+    @Override
+    protected void onCleared() {
+        super.onCleared();
+        detachView();
+        // todo
+        Log.d(getClass().getName(), "view model clear:" + this.toString());
     }
 
     /**
-     * 初始化
-     */
-    public abstract void init();
-
-    /**
-     * 视图被销毁时,任务被取消,界面也不存在了
+     * 界面被销毁时
      */
     public void detachView() {
-        commonLiveData = null;
-        dialogLiveData = null;
         onTaskCancel();
+        if (wrf != null) {
+            wrf.clear();
+            wrf = null;
+        }
     }
 
     /**
      * 当任务被取消时,界面还存在
      */
-    public void onTaskCancel() {
-        for (RawLiveData<?> liveData : liveDataList) {
-            liveData.cancelObserve();
-        }
-        liveDataList.clear();
-    }
+    public abstract void onTaskCancel();
 }

+ 3 - 45
mvp/src/main/java/com/miekir/mvp/view/BaseMvpActivity.java

@@ -4,10 +4,8 @@ package com.miekir.mvp.view;
 import android.os.Bundle;
 
 import com.miekir.mvp.base.BaseActivity;
-import com.miekir.mvp.bean.DataResult;
 import com.miekir.mvp.presenter.BasePresenter;
 
-import java.lang.reflect.Method;
 import java.util.ArrayList;
 import java.util.List;
 
@@ -15,35 +13,12 @@ import java.util.List;
  * 基于MVP思想的Activity
  * @author zhan
  */
-public abstract class BaseMvpActivity extends BaseActivity implements IView {
-    private List<Method> mDataMethodList = 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;
-        } else {
-            mLoadingNum = mLoadingNum -1;
-        }
-
-        if (mLoadingNum <= 0) {
-            mLoadingNum = 0;
-            dismissLoading();
-        } else {
-            showLoading(message);
-        }
-        return mLoadingNum;
-    }
+public abstract class BaseMvpActivity<V extends IView> extends BaseActivity implements IView {
+    private List<BasePresenter<V>> mInjectPresenters = new ArrayList<>();
 
     @Override
     public void onTaskCancel() {
-        mLoadingNum = 0;
-        for (BasePresenter viewModel : mInjectPresenters) {
+        for (BasePresenter<V> viewModel : mInjectPresenters) {
             viewModel.onTaskCancel();
         }
     }
@@ -53,23 +28,6 @@ public abstract class BaseMvpActivity extends BaseActivity implements IView {
         super.onCreate(savedInstanceState);
 
         ViewHelper.initVariables(mInjectPresenters, this, this);
-        ViewHelper.initCallbacks(mDataMethodList, getClass());
         initViews(savedInstanceState);
     }
-
-    @Override
-    protected void onDestroy() {
-        super.onDestroy();
-        ViewHelper.clearPresenters(mInjectPresenters, this);
-        mDataMethodList.clear();
-    }
-
-    /**
-     * 回调
-     * @param result
-     */
-    @Override
-    public void onDataResult(DataResult result) {
-        ViewHelper.handleDataResult(this, mDataMethodList, result);
-    }
 }

+ 96 - 111
mvp/src/main/java/com/miekir/mvp/view/BaseMvpFragment.java

@@ -1,21 +1,6 @@
 package com.miekir.mvp.view;
 
-import android.os.Bundle;
-import android.text.TextUtils;
-import android.view.View;
-
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
-import androidx.lifecycle.MutableLiveData;
-import androidx.lifecycle.Observer;
-
 import com.miekir.mvp.base.BaseFragment;
-import com.miekir.mvp.bean.DataResult;
-import com.miekir.mvp.presenter.BasePresenter;
-
-import java.lang.reflect.Method;
-import java.util.ArrayList;
-import java.util.List;
 
 // 第三个参数的类型
 //String objTypeName = method.getGenericParameterTypes()[2].toString();
@@ -24,100 +9,100 @@ import java.util.List;
 //}
 //objectParamsList.add(objTypeName);
 public abstract class BaseMvpFragment extends BaseFragment implements IView {
-    /**
-     * 是否被创建了
-     */
-    protected boolean isViewCreated;
-    /**
-     * 当前是否可见
-     */
-    protected boolean isUIVisible;
-
-    private List<Method> mDataMethodList = 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;
-        } else {
-            mLoadingNum = mLoadingNum -1;
-        }
-
-        if (mLoadingNum <= 0) {
-            mLoadingNum = 0;
-            dismissLoading();
-        } else {
-            showLoading(message);
-        }
-        return mLoadingNum;
-    }
-
-    @Override
-    public void onTaskCancel() {
-        mLoadingNum = 0;
-        for (BasePresenter viewModel : mInjectPresenters) {
-            viewModel.onTaskCancel();
-        }
-    }
-
-    @Override
-    public  void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
-        ViewHelper.initVariables(mInjectPresenters, this, this);
-        ViewHelper.initCallbacks(mDataMethodList, getClass());
-
-        isViewCreated = true;
-        onViewInit();
-        loadData();
-    }
-
-
-
-    /**
-     * View初始化
-     */
-    protected abstract void onViewInit();
-
-    @Override
-    public void setUserVisibleHint(boolean isVisibleToUser) {
-        super.setUserVisibleHint(isVisibleToUser);
-        isUIVisible = isVisibleToUser;
-        if (isVisibleToUser) {
-            loadData();
-        }
-    }
-
-    /**
-     * 懒加载,当Fragment可见的时候,再去加载数据
-     * 应用初始化会先调用完所有的setUserVisibleHint再调用onViewCreated,然后切换的时候,就只调用setUserVisibleHint了
-     */
-    private void loadData() {
-        if (isViewCreated && isUIVisible) {
-            isViewCreated = false;
-            isUIVisible = false;
-            onLazyLoad();
-        }
-    }
-
-    /**
-     * 懒加载,初始化加载数据
-     */
-    protected abstract void onLazyLoad();
-
-    @Override
-    public void onDestroyView() {
-        super.onDestroyView();
-        ViewHelper.clearPresenters(mInjectPresenters, this);
-        mDataMethodList.clear();
-    }
-
-    /**
-     * 回调
-     * @param result
-     */
-    @Override
-    public void onDataResult(DataResult result) {
-        ViewHelper.handleDataResult(this, mDataMethodList, result);
-    }
+//    /**
+//     * 是否被创建了
+//     */
+//    protected boolean isViewCreated;
+//    /**
+//     * 当前是否可见
+//     */
+//    protected boolean isUIVisible;
+//
+//    private List<Method> mDataMethodList = 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;
+//        } else {
+//            mLoadingNum = mLoadingNum -1;
+//        }
+//
+//        if (mLoadingNum <= 0) {
+//            mLoadingNum = 0;
+//            dismissLoading();
+//        } else {
+//            showLoading(message);
+//        }
+//        return mLoadingNum;
+//    }
+//
+//    @Override
+//    public void onTaskCancel() {
+//        mLoadingNum = 0;
+//        for (BasePresenter viewModel : mInjectPresenters) {
+//            viewModel.onTaskCancel();
+//        }
+//    }
+//
+//    @Override
+//    public  void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
+//        ViewHelper.initVariables(mInjectPresenters, this, this);
+//        ViewHelper.initCallbacks(mDataMethodList, getClass());
+//
+//        isViewCreated = true;
+//        onViewInit();
+//        loadData();
+//    }
+//
+//
+//
+//    /**
+//     * View初始化
+//     */
+//    protected abstract void onViewInit();
+//
+//    @Override
+//    public void setUserVisibleHint(boolean isVisibleToUser) {
+//        super.setUserVisibleHint(isVisibleToUser);
+//        isUIVisible = isVisibleToUser;
+//        if (isVisibleToUser) {
+//            loadData();
+//        }
+//    }
+//
+//    /**
+//     * 懒加载,当Fragment可见的时候,再去加载数据
+//     * 应用初始化会先调用完所有的setUserVisibleHint再调用onViewCreated,然后切换的时候,就只调用setUserVisibleHint了
+//     */
+//    private void loadData() {
+//        if (isViewCreated && isUIVisible) {
+//            isViewCreated = false;
+//            isUIVisible = false;
+//            onLazyLoad();
+//        }
+//    }
+//
+//    /**
+//     * 懒加载,初始化加载数据
+//     */
+//    protected abstract void onLazyLoad();
+//
+//    @Override
+//    public void onDestroyView() {
+//        super.onDestroyView();
+//        ViewHelper.clearPresenters(mInjectPresenters, this);
+//        mDataMethodList.clear();
+//    }
+//
+//    /**
+//     * 回调
+//     * @param result
+//     */
+//    @Override
+//    public void onDataResult(DataResult result) {
+//        ViewHelper.handleDataResult(this, mDataMethodList, result);
+//    }
 }

+ 0 - 6
mvp/src/main/java/com/miekir/mvp/view/IView.java

@@ -1,15 +1,9 @@
 package com.miekir.mvp.view;
 
-import com.miekir.mvp.bean.DataResult;
-
 public interface IView {
     void showLoading();
 
     void showLoading(String msg);
 
     void dismissLoading();
-
-    void onDataResult(DataResult result);
-
-    int onLoadTimeChange(boolean isAdd, String message);
 }

+ 12 - 178
mvp/src/main/java/com/miekir/mvp/view/ViewHelper.java

@@ -1,21 +1,12 @@
 package com.miekir.mvp.view;
 
-import android.text.TextUtils;
+import androidx.lifecycle.ViewModelProvider;
+import androidx.lifecycle.ViewModelStoreOwner;
 
-import androidx.lifecycle.LifecycleOwner;
-import androidx.lifecycle.MutableLiveData;
-import androidx.lifecycle.Observer;
-
-import com.miekir.mvp.bean.DataResult;
-import com.miekir.mvp.constant.DialogAction;
-import com.miekir.mvp.constant.MvpResponse;
-import com.miekir.mvp.model.DataMethod;
-import com.miekir.mvp.model.DataSource;
 import com.miekir.mvp.presenter.BasePresenter;
 import com.miekir.mvp.presenter.InjectPresenter;
 
 import java.lang.reflect.Field;
-import java.lang.reflect.Method;
 import java.util.List;
 
 /**
@@ -28,101 +19,18 @@ import java.util.List;
 public class ViewHelper {
     private ViewHelper() {}
 
-    /**
-     * 界面销毁时,清理Presenter
-     * @param mInjectPresenters
-     * @param owner
-     */
-    public static void clearPresenters(List<BasePresenter> mInjectPresenters, final LifecycleOwner owner) {
-        if (mInjectPresenters.size() > 0) {
-            for (BasePresenter presenter : mInjectPresenters) {
-                if (presenter == null) {
-                    continue;
-                }
-
-                MutableLiveData<DataResult<?>> liveData = presenter.getCommonLiveData();
-                MutableLiveData<DataResult<?>> dialogData = presenter.getDialogLiveData();
-                if (dialogData != null) {
-                    dialogData.removeObservers(owner);
-                }
-                if (liveData != null) {
-                    liveData.removeObservers(owner);
-                }
-                presenter.detachView();
-            }
-            mInjectPresenters.clear();
-        }
-    }
-
-    /**
-     * 初始化获取需要回调的注解方法
-     */
-    public static void initCallbacks(List<Method> mDataMethodList, Class<?> getClass) {
-        // 查找回调方法
-        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 != 3) {
-                throw new AssertionError(methodAnnotationName + "修饰的方法参数数量必须为3个");
-            }
-
-            // 响应结果,必须为int或者boolean
-            String firstType = method.getParameterTypes()[0].getSimpleName();
-            String resultCodeType = int.class.getSimpleName();
-            String resultStatusType = boolean.class.getSimpleName();
-            if (!TextUtils.equals(resultCodeType, firstType) && !TextUtils.equals(resultStatusType, firstType)) {
-                throw new AssertionError(methodAnnotationName + "修饰的方法第1个参数必须为" + resultCodeType + "或" + resultStatusType);
-            }
-
-            // 响应消息
-            String secondType = method.getParameterTypes()[1].getSimpleName();
-            String messageType = String.class.getSimpleName();
-            if (!TextUtils.equals(messageType, secondType)) {
-                throw new AssertionError(methodAnnotationName + "修饰的方法第2个参数必须为" + messageType);
-            }
-
-            method.setAccessible(true);
-            mDataMethodList.add(method);
-        }
-    }
-
     /**
      * 初始化添加注解的变量
      * final Class<? extends IView> getClass,可以代表接口的实现类
      */
-    public static void initVariables(List<BasePresenter> mInjectPresenters, final LifecycleOwner owner, final IView iView) {
-        ViewHelper.clearPresenters(mInjectPresenters, owner);
+    public static <V extends IView> void initVariables(List<BasePresenter<V>> mInjectPresenters, final ViewModelStoreOwner owner, final IView iView) {
+        mInjectPresenters.clear();
         // 这里可以获取到子类的成员变量
         Field[] fields = iView.getClass().getDeclaredFields();
         for (Field field : fields) {
             // 获取变量上面的注解类型
-            InjectPresenter injectViewModel = field.getAnnotation(InjectPresenter.class);
-            if (injectViewModel == null) {
+            InjectPresenter presenterAnnotation = field.getAnnotation(InjectPresenter.class);
+            if (presenterAnnotation == null) {
                 continue;
             }
 
@@ -130,43 +38,14 @@ public class ViewHelper {
                 field.setAccessible(true);
 
                 // 父类引用指向子类对象
-                Class<? extends BasePresenter> type = (Class<? extends BasePresenter>) field.getType();
-                BasePresenter 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()));
-                        iView.onDataResult(result);
-                    }
-                };
-
-                final Observer<DataResult> dialogObserver = new Observer<DataResult>() {
-                    @Override
-                    public void onChanged(final DataResult result) {
-                        if (result.getDataSource() == DialogAction.DIALOG_SHOW) {
-                            iView.onLoadTimeChange(true, result.getMessage());
-                        } else if (result.getDataSource() == DialogAction.DIALOG_DISMISS) {
-                            iView.onLoadTimeChange(false, result.getMessage());
-                        }
-                    }
-                };
-
-                if (injectViewModel.isPersist()) {
-                    presenter.getCommonLiveData().observeForever(observer);
-                    presenter.getDialogLiveData().observeForever(dialogObserver);
-                } else {
-                    presenter.getCommonLiveData().observe(owner, observer);
-                    presenter.getDialogLiveData().observe(owner, dialogObserver);
-                }
-
+                Class<? extends BasePresenter<V>> type = (Class<? extends BasePresenter<V>>) field.getType();
+                //BasePresenter<V> presenter = type.newInstance();
+                // todo 下面这种方法是单例形式,会造成重复回调的问题
+                BasePresenter<V> presenter = new ViewModelProvider(owner).get(type);
                 field.set(iView, presenter);
+                presenter.attachView((V) iView);
                 mInjectPresenters.add(presenter);
-            } catch (IllegalAccessException | InstantiationException e) {
+            } catch (IllegalAccessException e) {
                 e.printStackTrace();
             } catch (ClassCastException e) {
                 e.printStackTrace();
@@ -174,49 +53,4 @@ public class ViewHelper {
             }
         }
     }
-
-    /**
-     * 分发回调的数据
-     * @param object
-     * @param mDataMethodList
-     * @param result
-     */
-    public static void handleDataResult(Object object, List<Method> mDataMethodList, DataResult result) {
-        Class<?> objParamClass = null;
-        if (result != null && result.getBean() != null) {
-            objParamClass = result.getBean().getClass();
-        }
-
-        for (Method method : mDataMethodList) {
-            // 判断数据来源是否一致
-            int dataSource = DataSource.DEFAULT;
-            DataMethod dataMethod = method.getAnnotation(DataMethod.class);
-            if (dataMethod != null) {
-                dataSource = dataMethod.dataSource();
-            }
-
-            // 加载框的问题
-            if (dataSource != result.getDataSource()) {
-                continue;
-            }
-
-            // 判断方法的第三个参数类型是否是回调对象的父类
-            Class<?> methodParamClass = method.getParameterTypes()[2];
-            if (objParamClass != null && !methodParamClass.isAssignableFrom(objParamClass)) {
-                continue;
-            }
-
-            try {
-                method.invoke(object, result.getResponseCode(), result.getMessage(), result.getBean());
-            } catch (Exception e) {
-                e.printStackTrace();
-            }
-
-            try {
-                method.invoke(object, result.getResponseCode() == MvpResponse.SUCCESS, result.getMessage(), result.getBean());
-            } catch (Exception e) {
-                e.printStackTrace();
-            }
-        }
-    }
 }

+ 1 - 1
network/build.gradle

@@ -54,7 +54,7 @@ dependencies {
     implementation project(path: ':common')
     implementation fileTree(dir: 'libs', include: ['*.jar'])
 
-    implementation 'androidx.appcompat:appcompat:1.3.0-alpha01'
+    implementation 'androidx.appcompat:appcompat:1.3.0-alpha02'
     testImplementation 'junit:junit:4.12'
     androidTestImplementation 'androidx.test.ext:junit:1.1.1'
     androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'

+ 0 - 50
network/src/main/java/com/miekir/network/core/impl/LoadingObserver.java

@@ -1,50 +0,0 @@
-package com.miekir.network.core.impl;
-
-import com.miekir.common.utils.ContextManager;
-import com.miekir.mvp.presenter.BasePresenter;
-import com.miekir.network.R;
-import com.miekir.network.core.base.BaseObserver;
-
-import io.reactivex.annotations.NonNull;
-import io.reactivex.disposables.Disposable;
-
-/**
- * 带加载框的观察者
- * 需要加载框时,调用onSubscribe同时显示加载框,
- * 流程走到onComplete/onError时隐藏加载框。
- * @author Miekir
- */
-public abstract class LoadingObserver<T> extends BaseObserver<T> {
-    private BasePresenter mViewModel;
-    private String mText;
-
-    public LoadingObserver(BasePresenter viewModel) {
-        this(viewModel, ContextManager.getInstance().getContext().getString(R.string.network_loading));
-    }
-
-    private LoadingObserver(BasePresenter viewModel, String text) {
-        this.mViewModel = viewModel;
-        this.mText = text;
-    }
-
-    @Override
-    public void onSubscribe(@NonNull Disposable d) {
-        super.onSubscribe(d);
-        if (d.isDisposed()) {
-            return;
-        }
-        mViewModel.showLoading(mText);
-    }
-
-    @Override
-    public void onComplete() {
-        super.onComplete();
-        mViewModel.dismissLoading();
-    }
-
-    @Override
-    public void onError(@NonNull Throwable e) {
-        super.onError(e);
-        mViewModel.dismissLoading();
-    }
-}