繁体   English   中英

如何使用Rxjava进行长时间运行的后台任务

[英]How to use Rxjava for long running background task

我正在使用rxjava将一些上传任务发送到服务器,每当任务启动的片段或活动被销毁时,我将处理订阅以避免内存泄漏,但我想要的是甚至在片段/活动被破坏后我需要继续运行的任务背景,有没有办法实现这个目标?

doSomeLongRunningBgTaks()
     .subscribe()
     .addTo(compositeDisposal)
override onDestroy(){
  compositeDisposal.clear()
}

是否必须一直处理订阅? 如果不是何时使用处置?

首先,您必须了解现代版AndroidOS的后台任务限制。 所有关于它[链接]( https://developer.android.com/about/versions/oreo/background )简而言之,如果您的应用程序不可见或您的应用程序没有正在运行的前台服务,那么没有任何保证您的后台工作完成。

其次,在您的情况下,您需要拥有一些与您的片段或活动的任何生命周期无关并且能够运行后台工作的实体。 有几种可能的解决方案

1)Android服务方式

创建一个Intent服务。 这是一个简单的服务,已经实现了具有内部队列的块。 每次客户端尝试通过此类服务执行作业时,服务都会在后台队列中执行此类任务。 因此,如果您执行两次,服务将在执行第二个任务之前首先完成任务。

import android.app.IntentService import android.content.Intent

class MyIntentService : IntentService("My intent service") {

  // This method already in another thread (not UI thread)
  override fun onHandleIntent(intent: Intent?) {
    doLongRunningBackgroundJob()
  }
}

PS不要忘记在Manifest文件中注册此类服务。

2)Android处理程序方式

您可以使用内部Android处理程序创建一个具有准备好的背景循环器的类。 例如:

import android.os.Handler
import android.os.HandlerThread

class MyBackgroundWorker {

  private val handler = initHandler()

  private fun initHandler(): Handler {
    val handlerThread = HandlerThread("My background thread")
    handlerThread.start()
    return Handler(handlerThread.looper)
  }

  fun executeJobInBackground(job: Runnable) {
    handler.post(job)
  }
}

3)纯java方式

您可以创建纯线程的实例,但更可取的是使用执行程序Java框架。 对于线程方法:

class MyBackgroundWorker {

  fun executeJobInBackground(job: Runnable) {
    Thread(job).start()
  }
}

对于执行者方法:

import java.util.concurrent.Executors

class MyBackgroundWorker {

  private val executor = Executors.newSingleThreadExecutor()

  fun executeJobInBackground(job: Runnable) {
    executor.execute(job)
  }
}

PS不要忘记使用DI方法提供依赖关系。

那你为什么需要Disposable?

所以如果你有一些可观察的如下:

Observable.just("Hello world!")
     .delay(1, TimeUnit.SECONDS)
     .subscribeWith(new DisposableObserver<String>() {
         @Override public void onStart() {
             System.out.println("Start!");
         }
         @Override public void onNext(String t) {
             System.out.println(t);
         }
         @Override public void onError(Throwable t) {
             t.printStackTrace();
         }
         @Override public void onComplete() {
             System.out.println("Done!");
         }
     });

现在,如果你想要停止这个任务,那么它只能通过dispose()处理。

一段时间,如果用户想要处理任何任务,例如:如果用户从屏幕导航或用户按下后退按钮,那么我们必须终止Web请求或取消任何任务,使用Disposable。

如果你必须在后台执行任何任务而不是在片段被销毁时杀死怎么办?

你可以简单地只写subscribe()方法并忘记任务。

doSomeLongRunningBgTaks()
     .subscribe()

可能它会帮助你。 谢谢

你可以使用这样的东西:

webService.doSomething(someData)
      .observeOn(AndroidSchedulers.mainThread())
      .subscribe(
          result -> resultText.setText("It worked!"),
          e -> handleError(e));

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM