RxJava2 Позволяет завершить сетевой вызов, если фрагмент / активность изменяется - PullRequest
0 голосов
/ 30 мая 2018

У меня есть серия последовательных сетевых вызовов Parse, которые все зависят друг от друга, чтобы сохранить конечный объект, завернутый в Observable, чтобы я мог обрабатывать все как один вызов в моем докладчике.

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

Если я вызову disables.s.dispose (), наблюдаемое выдаст ошибку(который я могу поймать) в следующем методе .save в Observable, и сетевой вызов не завершается.

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

Мне все равно, будет ли вызван oncomplete / onerror, если пользователь попадет в эту ситуацию, но яхотел бы убедиться, что он завершается тем или иным способом.

Есть ли способ разрешить завершение вызова, но не вызвать утечку памяти, не удаляя его?

fun doParseNetworkCall(){
  return Observable.create<Boolean> { emitter ->
    createParseObject1
    createParseObject1.save()

    createParseObject2
    createParseObject2.add(key, createParseObject1)
    createParseObject2.save()

    createParseObject3
    createParseObject3.add(key, createParseObject2)
    createParseObject3.save()

    emitter.onNext(true)
}


fun doNetworkCall(){
    repo.doParseNetworkCall()
        .observeOn(AndroidSchedulers.mainThread())
        .subscribeOn(Schedulers.io()).subscribeBy(
            onError = { error ->
                //do something
            },
            onComplete = {
               //do something
            }
        ).addTo(disposable)
}

1 Ответ

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

Мне удалось решить мою проблему, выполнив следующие действия.Я считаю безопасным для памяти, поскольку 2-й набор наблюдаемых не подписывается до тех пор, пока не завершится первая наблюдаемая, и если Composite Disposable в презентаторе уже удалено, 2-й набор не будет подписываться.

repo.saveSomething()
                .map {
                    //Do some non view stuff
                }
                .observeOn(AndroidSchedulers.mainThread())
                .subscribeOn(Schedulers.io()).subscribeBy(
                    onError = { error ->
                       onErrorMethod()
                    },
                    onComplete = {
                       onSuccessMethod()
                    }
                )

 fun onSuccessMethod() {
        Observable.just(true)
            .observeOn(AndroidSchedulers.mainThread())
            .subscribeOn(Schedulers.io()).subscribeBy(
                onComplete = {
                   //Do view stuff
                }).addTo(disposable)
    }

fun onErrorMethod() {
        Observable.just(true)
            .observeOn(AndroidSchedulers.mainThread())
            .subscribeOn(Schedulers.io()).subscribeBy(
                onComplete = {
                   //Do view stuff
                }).addTo(disposable)
    }
...