Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/220.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android RxJava2允许在片段/活动更改时完成网络调用_Android_Rx Java2 - Fatal编程技术网

Android RxJava2允许在片段/活动更改时完成网络调用

Android RxJava2允许在片段/活动更改时完成网络调用,android,rx-java2,Android,Rx Java2,我有一系列连续的解析网络调用,它们相互依赖,以保存最终的对象,所有对象都由一个可观察对象包装,这样我就可以在演示器中作为一个调用来处理所有事情 如果用户决定更改片段,或离开应用程序或其他什么,这个网络呼叫非常重要,我希望它能够尝试完成 如果我调用disposables.dispose(),observable将在observable中的next.save方法上抛出一个错误(我可以捕捉到),并且网络调用不会完成 如果我不处理它,网络调用将完成,但它将调用我的onComplete并抛出一个错误,因为

我有一系列连续的解析网络调用,它们相互依赖,以保存最终的对象,所有对象都由一个可观察对象包装,这样我就可以在演示器中作为一个调用来处理所有事情

如果用户决定更改片段,或离开应用程序或其他什么,这个网络呼叫非常重要,我希望它能够尝试完成

如果我调用disposables.dispose(),observable将在observable中的next.save方法上抛出一个错误(我可以捕捉到),并且网络调用不会完成

如果我不处理它,网络调用将完成,但它将调用我的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)
}
fun doParseNetworkCall(){
返回Observable.create{emitter->
createParseObject1
createParseObject1.save()
createParseObject2
createParseObject2.add(键,createParseObject1)
createParseObject2.save()
createParseObject3
createParseObject3.add(键,createParseObject2)
createParseObject3.save()
emitter.onNext(真)
}
有趣的网络电话{
repo.doParseNetworkCall()
.observeOn(AndroidSchedulers.mainThread())
.subscribeOn(Schedulers.io()).subscribeBy(
onError={错误->
//做点什么
},
未完成={
//做点什么
}
).addTo(一次性)
}

我通过以下操作解决了我的问题。我认为这是内存安全的,因为第二组观察对象在第一组观察对象完成之前不会订阅,如果演示者中的
组合一次性
已被处置,第二组将不会订阅

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


如果
onComplete()
onError(),则流结束
被调用,在这种情况下,如果调用onComplete或onError,您不需要进行处理。访问分离的视图时,它会崩溃。如果我将片段切换为不调用onComplete/onError,我尝试在其中加入逻辑,但这正是我担心内存泄漏的地方。当它访问onComplete或onError时,我怎么能有onComplete调用而不崩溃呢视图?如果view!=null,则将整个oncomplete/onerror包装在视图!=null上?使用不做任何操作的观察者订阅,然后使用更新UI的观察者订阅如何。这样,当您处理UI观察者时,流将继续,因为它仍然订阅了一个观察者。这可能不是最干净的方式,但我认为它可以完成任务我们的api调用独立于活动/片段,因此您必须在服务中调用api(可能是意图服务)并提供对活动或片段的回拨。如果我必须使用intent服务,我会这样做,但我希望避免这种情况。因为我不关心屏幕发生变化时它会返回什么,所以我希望有一种方法可以做到这一点。我会在上午尝试两个订户。
 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)
    }