Отмена загрузки файла (дооснащение) началась с сопрограммы Kotlin Android - PullRequest
0 голосов
/ 27 мая 2018

Я пытаюсь избавиться от RxJava2 в моем проекте и заменить его сопрограммами kotlin.90% моего кода RxJava больше не существует, но я все еще не могу заменить один сетевой запрос.Пользователь может отправлять фотографии на сервер в моём приложении (запрос данных из нескольких частей, используя модификацию).Пользователь также может отменить загрузку фотографии, если она еще не была загружена.С помощью RxJava я смог сохранить объект Disposable запроса на загрузку, и если он еще не был удален, я мог бы удалить его, если пользователь нажал кнопку «Отменить загрузку».В результате этого действия сетевой запрос также был отменен.Таким образом, мы могли бы сэкономить трафик пользователя и батарею.Можно ли добиться такой же логики с соплинами kotlin?В официальных документах написано, что отмена сопрограмм является кооперативной, и нам нужна некоторая функция приостановки в цикле (или между отправкой частей файла), чтобы остановить сопрограмму.Так это тот случай, когда RxJava - лучший выбор, или я что-то пропустил?

1 Ответ

0 голосов
/ 29 мая 2018

Если вы используете дооснащение для своих сетевых вызовов, вы можете добавить их адаптер вызова сопрограмм из здесь .

Вы отменяете работающую часть сопрограммы, отменяя ее работу.Например, если вы используете launch для запуска сопрограммы, он возвращает объект Job, который можно отменить.

val job = launch {
        repeat(1000) { i ->
            println("I'm sleeping $i ...")
            delay(500L)
        }
    }
    delay(1300L) // delay a bit
    println("main: I'm tired of waiting!")
    job.cancel() // cancels the job
    job.join() // waits for job's completion 
    println("main: Now I can quit.")

Если вы не используете модификацию и не используете другую библиотеку, вы можете получить isActive внутри вашей сопрограммы и отмените запрос из вашей библиотеки.

fun main(args: Array<String>) = runBlocking<Unit> {
    val startTime = System.currentTimeMillis()
    val job = launch {
        var nextPrintTime = startTime
        var i = 0
        while (isActive) { // cancellable computation loop
            // print a message twice a second
            if (System.currentTimeMillis() >= nextPrintTime) {
                println("I'm sleeping ${i++} ...")
                nextPrintTime += 500L
            }
        }
    }
    delay(1300L) // delay a bit
    println("main: I'm tired of waiting!")
    job.cancelAndJoin() // cancels the job and waits for its completion
    println("main: Now I can quit.")
}
...