Прежде всего, вы должны знать об ограничении фоновых задач современных версий AndroidOS. Все об этом здесь [ссылка] (https://developer.android.com/about/versions/oreo/background) Короче говоря, если ваше приложение не отображается или в вашем приложении не запущена служба переднего плана, нет никакой гарантии, что ваша фоновая работа будет завершена.
Во-вторых, в вашем случае вам нужно иметь некую сущность, которая не привязана ни к какому жизненному циклу ваших фрагментов или активности и способна выполнять фоновую работу. Есть несколько возможных решений
1) Способ службы Android
Создайте службу намерения. Это простой сервис с уже реализованными блоками, который имеет внутреннюю очередь. Каждый раз, когда клиент пытается выполнить задание через такой сервис, сервис выполняет такое задание в фоновой очереди. Поэтому, если вы выполните его дважды, служба будет ожидать завершения первой задачи до выполнения второй задачи.
импортировать 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()
}
}
P.S. Не забудьте зарегистрировать такой сервис в файле манифеста.
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 framework. Для потокового подхода:
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)
}
}
P.S. Не забудьте предоставить зависимости, используя подход DI.
person
Oleg Kuzmin
schedule
11.09.2019