Преглед на файлове

恢复原有主动取消逻辑

詹子聪 преди 5 години
родител
ревизия
2ffa6289aa

+ 1 - 1
app/src/main/java/com/miekir/newmvp/ui/home/article/model/LocalArticleModel.java

@@ -39,6 +39,6 @@ public class LocalArticleModel extends BaseModel implements IArticleModel {
         }, error -> {
             LogTool.d(getClass().getName(), error.getMessage());
         });
-
+        mProgressDisposableList.add(disposable);
     }
 }

+ 2 - 0
app/src/main/java/com/miekir/newmvp/ui/home/article/model/NetArticleModel.java

@@ -44,5 +44,7 @@ public class NetArticleModel extends BaseModel implements IArticleModel {
         }, error -> {
             LogTool.d(getClass().getName(), error.getMessage());
         });
+
+        mProgressDisposableList.add(disposable);
     }
 }

+ 4 - 7
app/src/main/java/com/miekir/newmvp/ui/home/article/presenter/SimpleArticlePresenter.java

@@ -1,7 +1,5 @@
 package com.miekir.newmvp.ui.home.article.presenter;
 
-import android.app.Application;
-
 import com.miekir.common.utils.LogTool;
 import com.miekir.mvp.presenter.BasePresenter;
 import com.miekir.network.widget.observe.MvpObserver;
@@ -11,6 +9,7 @@ import com.rxjava.rxlife.RxLife;
 import io.reactivex.Observable;
 import io.reactivex.ObservableOnSubscribe;
 import io.reactivex.android.schedulers.AndroidSchedulers;
+import io.reactivex.disposables.Disposable;
 import io.reactivex.observers.DisposableObserver;
 import io.reactivex.schedulers.Schedulers;
 
@@ -23,10 +22,6 @@ import io.reactivex.schedulers.Schedulers;
  */
 public class SimpleArticlePresenter extends BasePresenter<IArticleView> {
 
-    public SimpleArticlePresenter(Application application) {
-        super(application);
-    }
-
     @Override
     public void onInit() {}
 
@@ -35,7 +30,7 @@ public class SimpleArticlePresenter extends BasePresenter<IArticleView> {
      */
     public void doWork() {
         //showProgress();
-        Observable.create((ObservableOnSubscribe<String>) emitter -> {
+        Disposable disposable = Observable.create((ObservableOnSubscribe<String>) emitter -> {
             try {
                 Thread.sleep(5000);
             } catch (Exception e) {
@@ -54,6 +49,7 @@ public class SimpleArticlePresenter extends BasePresenter<IArticleView> {
                 LogTool.d(getClass().getName(), error.getMessage());
             });
 
+        mBackDisposableList.add(disposable);
     }
 
     /**
@@ -73,6 +69,7 @@ public class SimpleArticlePresenter extends BasePresenter<IArticleView> {
             }
         };
 
+        mBackDisposableList.add(disposable);
 
         Observable.create((ObservableOnSubscribe<String>) emitter -> {
             try {

+ 7 - 3
common/build.gradle

@@ -47,12 +47,13 @@ dependencies {
     api 'androidx.appcompat:appcompat:1.3.0-alpha02'
 
     // 防止Retrofit内存泄露
-    //api 'com.trello.rxlifecycle3:rxlifecycle:3.1.0'
-    //api 'com.trello.rxlifecycle3:rxlifecycle-android:3.1.0'
-    //api 'com.trello.rxlifecycle3:rxlifecycle-components:3.1.0'
+    api 'com.trello.rxlifecycle3:rxlifecycle:3.1.0'
+    api 'com.trello.rxlifecycle3:rxlifecycle-android:3.1.0'
+    api 'com.trello.rxlifecycle3:rxlifecycle-components:3.1.0'
 
     //rxjava2 支持在主线程回调 https://github.com/liujingxing/rxjava-RxLife
     api 'com.ljx.rxlife2:rxlife-rxjava:2.0.0'
+    api 'com.ljx.rxlife:rxlife-coroutine:2.0.0'
 
     // 带行号的Log
     api 'com.github.zhaokaiqiang.klog:library:1.6.0'
@@ -76,4 +77,7 @@ dependencies {
     // 动态代理
     //api group: 'cglib', name: 'cglib', version: '3.3.0'
 
+    // utils 集合了大量常用的工具类
+    api 'com.blankj:utilcodex:1.26.0'
+
 }

+ 8 - 2
mvp/src/main/java/com/miekir/mvp/model/BaseModel.java

@@ -3,6 +3,8 @@ package com.miekir.mvp.model;
 import com.miekir.common.utils.LogTool;
 import com.miekir.mvp.presenter.BasePresenter;
 
+import io.reactivex.disposables.CompositeDisposable;
+
 
 /**
  * Copyright (C), 2019-2020, Miekir
@@ -18,13 +20,17 @@ public abstract class BaseModel {
         mPresenter = presenter;
     }
 
-    // todo
+    protected CompositeDisposable mProgressDisposableList = new CompositeDisposable();
+    protected CompositeDisposable mBackDisposableList = new CompositeDisposable();
+
     public void onProgressTaskCancel() {
+        mProgressDisposableList.dispose();
+        mProgressDisposableList = new CompositeDisposable();
         LogTool.d(getClass().getName(), "progress model cancel");
     }
 
-    // todo
     public void onBackTaskCancel() {
+        mBackDisposableList.dispose();
         mPresenter = null;
         LogTool.d(getClass().getName(), "back model cancel");
     }

+ 17 - 9
mvp/src/main/java/com/miekir/mvp/presenter/BasePresenter.java

@@ -1,21 +1,18 @@
 package com.miekir.mvp.presenter;
 
-import android.app.Application;
-
-import androidx.annotation.NonNull;
-
+import com.blankj.utilcode.util.Utils;
 import com.miekir.mvp.model.BaseModel;
 import com.miekir.mvp.view.IView;
 import com.rxjava.rxlife.ScopeViewModel;
 
-import org.jetbrains.annotations.NotNull;
-
 import java.lang.ref.WeakReference;
 import java.util.List;
 import java.util.Optional;
 import java.util.concurrent.CopyOnWriteArrayList;
 import java.util.function.Consumer;
 
+import io.reactivex.disposables.CompositeDisposable;
+
 
 /**
  * Copyright (C), 2019-2020, Miekir
@@ -30,6 +27,14 @@ import java.util.function.Consumer;
  */
 public abstract class BasePresenter<V extends IView> extends ScopeViewModel {
     private WeakReference<V> mViewReference;
+    /**
+     * 有加载框的可取消任务,完成之后,会自动移除
+     */
+    protected CompositeDisposable mProgressDisposableList = new CompositeDisposable();
+    /**
+     * 后台没有加载框的可取消任务,完成之后,会自动移除
+     */
+    protected CompositeDisposable mBackDisposableList = new CompositeDisposable();
     /**
      * 有加载框的可取消任务, for model
      */
@@ -39,8 +44,8 @@ public abstract class BasePresenter<V extends IView> extends ScopeViewModel {
      */
     private List<BaseModel> mBackModelList = new CopyOnWriteArrayList<>();
 
-    public BasePresenter(@NonNull @NotNull Application application) {
-        super(application);
+    public BasePresenter() {
+        super(Utils.getApp());
         PresenterHelper.initModelList(mProgressModelList, mBackModelList, this);
         onInit();
     }
@@ -50,6 +55,7 @@ public abstract class BasePresenter<V extends IView> extends ScopeViewModel {
      * @param consumer 要执行的操作
      */
     public void post(Consumer<? super V> consumer) {
+
         Optional.ofNullable(getView()).ifPresent(consumer);
     }
 
@@ -77,6 +83,7 @@ public abstract class BasePresenter<V extends IView> extends ScopeViewModel {
      * 没有加载框的任务被取消
      */
     private void onBackTaskCancel() {
+        mBackDisposableList.dispose();
         for (BaseModel model : mBackModelList) {
             model.onProgressTaskCancel();
         }
@@ -87,7 +94,8 @@ public abstract class BasePresenter<V extends IView> extends ScopeViewModel {
      * 界面还存在,可见任务被取消,响应加载框的取消
      */
     public void onProgressTaskCancel() {
-
+        mProgressDisposableList.dispose();
+        mProgressDisposableList = new CompositeDisposable();
 
         for (BaseModel model : mProgressModelList) {
             model.onProgressTaskCancel();

+ 19 - 0
mvp/src/main/java/com/miekir/mvp/presenter/BasePresenterKt.kt

@@ -0,0 +1,19 @@
+package com.miekir.mvp.presenter
+
+import androidx.lifecycle.AndroidViewModel
+import androidx.lifecycle.rxLifeScope
+import com.blankj.utilcode.util.Utils
+import kotlinx.coroutines.CoroutineScope
+import kotlinx.coroutines.Job
+
+open class BasePresenterKt : AndroidViewModel(Utils.getApp()) {
+    /**
+     * 所有网络请求都在 rxLifeScope 域中启动,当页面销毁时会自动
+     * 取消所有协程
+     * @param block 网络请求
+     * @param onError 失败回调
+     */
+    fun launchUI(block: suspend CoroutineScope.() -> Unit, onError: ((Throwable) -> Unit)? = null): Job {
+        return rxLifeScope.launch(block, onError)
+    }
+}

+ 11 - 0
mvp/src/main/java/com/miekir/mvp/presenter/LifeCirclePresenter.java

@@ -0,0 +1,11 @@
+package com.miekir.mvp.presenter;
+
+import androidx.lifecycle.AndroidViewModel;
+
+import com.blankj.utilcode.util.Utils;
+
+public class LifeCirclePresenter extends AndroidViewModel {
+    public LifeCirclePresenter() {
+        super(Utils.getApp());
+    }
+}