Android RxJava取消旧请求

Android RxJava取消旧请求,android,rx-java,rx-android,Android,Rx Java,Rx Android,我是Rxjava新手,在下面描述的场景中探索各种可能性并需要帮助 步骤1:滑动视图 步骤2:进行API调用以获取数据 对于视图的数量,重复上述步骤 问题: API_调用_1获取视图_1结果 用户滑动视图2 API_调用_2获取视图_2结果 视图_1结果与视图_2结果一起返回并填充到视图_2中 当API调用2请求时,我需要取消API调用1请求。 谢谢。班级成员: Subscription mSubscription; 您的API调用: if(subscription != null &&

我是Rxjava新手,在下面描述的场景中探索各种可能性并需要帮助

步骤1:滑动视图
步骤2:进行API调用以获取数据

对于视图的数量,重复上述步骤

问题:

  • API_调用_1获取视图_1结果
  • 用户滑动视图2
  • API_调用_2获取视图_2结果
  • 视图_1结果与视图_2结果一起返回并填充到视图_2中
  • 当API调用2请求时,我需要取消API调用1请求。 谢谢。

    班级成员:

    Subscription mSubscription;
    
    您的API调用:

    if(subscription != null && !subscription.isUnsubscribed()){
        subscription.unsubscribe();
        subscription = null;
    }
    subscription = doApiCall("some_id")
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(new Action1<Object>() {
                @Override
                public void call(Object o) {
    
                }
            }, new Action1<Throwable>() {
                @Override
                public void call(Throwable throwable) {
    
                }
            });
    

    在开始新呼叫之前

    更好的方法是使用switchMap取消以前的请求

    您可以使用“switchMap”操作符提供“取消”逻辑。例如,您希望开始/停止加载(代码用Kotlin编写)

    val loadingObservable=可观测的计时器(10,时间单位:秒)
    val load=PublishSubject.create()
    val resultObservable=load.switchMap{if(it)loadingObservable else Observable.never()}
    
    说明:

  • “loadingObservable”是模拟长时间运行操作的计时器
  • “加载”是用户发出的启动或停止加载的命令。如果你愿意 要开始加载,请发送True或False
  • “switchMap”运算符为 设计用来处理以前的可观察到的。所以,如果你真的发送,它会 开始加载。如果发送False,它将处理(取消)以前的 可见的

  • 每个RxJava网络请求您都有一个订阅,取消订阅请求下一个视图swiped@RajeshRajendiran,是否有任何方法可以自动取消订阅,如switchMap或任何类似的。switchMap、flatMap都是RxJava中的运算符(就像+、-、*…)基底可以观察到更多,谢谢Alexander。我按照你的建议退订了。我在刷卡时仍在接收旧数据。订阅时,subscription.isunsubscripted()始终为true!=null@VinayKG,请张贴您的密码。没有代码我很难帮助你。谢谢
    if(subscription != null && !subscription.isUnsubscribed()){
        subscription.unsubscribe();
        subscription = null;
    }
    
    val loadingObservable = Observable.timer(10, TimeUnit.SECONDS)
    val load = PublishSubject.create<Boolean>()
    val resultObservable = load.switchMap { if(it) loadingObservable else Observable.never() }