首先,您必须了解现代版本 AndroidOS 的后台任务限制。关于它的所有内容 [链接] (https://developer.android.com/about/versions/oreo/background)
简而言之,如果您的应用不可见或您的应用没有正在运行的前台服务,则无法保证您的后台工作已完成。
其次,在您的情况下,您需要有一些实体,它与您的片段或活动的任何生命周期无关,并且能够运行后台工作。有几种可能的解决方案
1)Android服务方式
创建一个 Intent 服务。这是一个简单的服务,已经实现了具有内部队列的块。每次客户端尝试通过此类服务执行作业时,服务都会在后台队列中执行此类任务。因此,如果您执行两次,该服务将在执行第二个任务之前完成第一个任务。
导入 android.app.IntentService
导入android.content.Intent
class MyIntentService : IntentService("My intent service") {
// This method already in another thread (not UI thread)
override fun onHandleIntent(intent: Intent?) {
doLongRunningBackgroundJob()
}
}
附注不要忘记在 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框架的executors。
对于线程方法:
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)
}
}
附注不要忘记使用 DI 方法提供依赖项。