ソースを参照

kotlin下的Presenter

詹子聪 5 年 前
コミット
2bd5611641

+ 4 - 0
app/src/main/java/com/miekir/newmvp/ui/home/HomeActivity.java

@@ -9,6 +9,7 @@ import com.miekir.mvp.presenter.InjectPresenter;
 import com.miekir.mvp.view.BaseMvpActivity;
 import com.miekir.newmvp.R;
 import com.miekir.newmvp.ui.home.article.presenter.ArticlePresenter;
+import com.miekir.newmvp.ui.home.article.presenter.AutoPresenter;
 import com.miekir.newmvp.ui.home.article.presenter.SimpleArticlePresenter;
 
 public class HomeActivity extends BaseMvpActivity implements View.OnClickListener, IArticleView {
@@ -19,6 +20,9 @@ public class HomeActivity extends BaseMvpActivity implements View.OnClickListene
     @InjectPresenter
     SimpleArticlePresenter mSimplePresenter;
 
+    @InjectPresenter
+    AutoPresenter<IArticleView> mAutoPresenter;
+
     @Override
     public int getLayoutId() {
         return R.layout.activity_main;

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

@@ -1,7 +1,5 @@
 package com.miekir.newmvp.ui.home.article.presenter;
 
-import android.app.Application;
-
 import com.miekir.mvp.constant.MvpRepository;
 import com.miekir.mvp.model.InjectModel;
 import com.miekir.mvp.presenter.BasePresenter;
@@ -26,11 +24,6 @@ public class ArticlePresenter extends BasePresenter<IArticleView> {
     @InjectModel
     private LocalArticleModel mLocalModel;
 
-    public ArticlePresenter(Application application) {
-        super(application);
-    }
-
-
     @Override
     public void onInit() {
         mModel = mNetModel;

+ 6 - 4
app/src/main/java/com/miekir/newmvp/ui/home/article/presenter/AutoPresenter.kt

@@ -3,7 +3,7 @@ package com.miekir.newmvp.ui.home.article.presenter
 import com.miekir.common.utils.LogTool
 import com.miekir.mvp.presenter.BasePresenterKt
 import com.miekir.newmvp.ui.home.IArticleView
-import com.rxjava.rxlife.RxLife
+import com.rxjava.rxlife.life
 import io.reactivex.Observable
 import io.reactivex.ObservableEmitter
 import io.reactivex.ObservableOnSubscribe
@@ -11,7 +11,7 @@ import io.reactivex.schedulers.Schedulers
 
 class AutoPresenter<V : IArticleView> : BasePresenterKt<V>() {
 
-    fun doWork() {
+    fun doWorkOld() {
         //showProgress();
         val disposable = Observable.create(ObservableOnSubscribe { emitter: ObservableEmitter<String?> ->
             try {
@@ -23,7 +23,7 @@ class AutoPresenter<V : IArticleView> : BasePresenterKt<V>() {
             emitter.onComplete()
         } as ObservableOnSubscribe<String?>)
         .subscribeOn(Schedulers.io())
-        .`as`(RxLife.asOnMain(this))
+        .life(this)
         .subscribe({ next: String? ->
             LogTool.d("MainPresenter", "onNext thread is: " + Thread.currentThread().name)
             view?.onArticleResult("result from kotlin")
@@ -34,8 +34,10 @@ class AutoPresenter<V : IArticleView> : BasePresenterKt<V>() {
         }
 
         mBackDisposableList.add(disposable)
+    }
 
-        launchTask({
+    fun doWorkNew() {
+        val job = launchProgressTask({
             //协程体
         }, {
             //异常回调

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

@@ -81,7 +81,7 @@ public abstract class BasePresenter<V extends IView> extends ScopeViewModel {
     /**
      * 没有加载框的任务被取消
      */
-    private void onBackTaskCancel() {
+    protected void onBackTaskCancel() {
         mBackDisposableList.dispose();
         for (BaseModel model : mBackModelList) {
             model.onProgressTaskCancel();

+ 44 - 3
mvp/src/main/java/com/miekir/mvp/presenter/BasePresenterKt.kt

@@ -7,14 +7,55 @@ import kotlinx.coroutines.Job
 
 //open class BasePresenterKt : AndroidViewModel(Utils.getApp()) {
 abstract class BasePresenterKt<V : IView>: BasePresenter<V>() {
+    private val mProgressJobList = ArrayList<Job>()
+    private val mBackgroundJobList = ArrayList<Job>()
+
     /**
      * 所有网络请求都在 rxLifeScope 域中启动,当页面销毁时会自动
      * 取消所有协程
      * @param block 网络请求
      * @param onError 失败回调
-     *
+     * 可见任务
+     */
+    fun launchProgressTask(block: suspend CoroutineScope.() -> Unit, onError: ((Throwable) -> Unit)? = null): Job {
+        var job : Job? = null
+        job = rxLifeScope.launch(block, onError, {}, { mProgressJobList.remove(job) })
+        mProgressJobList.add(job)
+        return job
+    }
+
+    /**
+     * 不可见任务
+     */
+    fun launchBackgroundTask(block: suspend CoroutineScope.() -> Unit, onError: ((Throwable) -> Unit)? = null): Job {
+        var job : Job? = null
+        job = rxLifeScope.launch(block, onError, {}, { mBackgroundJobList.remove(job) })
+        mBackgroundJobList.add(job)
+        return job
+    }
+
+    override fun onProgressTaskCancel() {
+        super.onProgressTaskCancel()
+        recycleTask(mProgressJobList)
+    }
+
+    override fun onBackTaskCancel() {
+        super.onBackTaskCancel()
+        recycleTask(mBackgroundJobList)
+    }
+
+    /**
+     * 取消任务
      */
-    fun launchTask(block: suspend CoroutineScope.() -> Unit, onError: ((Throwable) -> Unit)? = null): Job {
-        return rxLifeScope.launch(block, onError)
+    private fun recycleTask(jobList : ArrayList<Job>) {
+        val size = jobList.size
+        var index = 0
+        while (index < size) {
+            if (jobList[index].isActive) {
+                jobList[index].cancel()
+            }
+            jobList.removeAt(index)
+            index++
+        }
     }
 }