android rxjava repeating a request

后端 未结 2 1269
臣服心动
臣服心动 2021-01-03 15:43

I am trying to achieve the following. I load a list of objects I want to get values to put in a list later.

First I gather all the values into an array (to mountain

相关标签:
2条回答
  • 2021-01-03 15:51

    Well actually, you do not put interval anywhere, for repeating the operation every x interval, you should use repeat operator variant called repeatWhen where you can provide your interval logic in this way:

    .repeatWhen(completed -> completed.delay(5, TimeUnit.SECONDS))
    

    repeatWhen() will hand to you an Observable that transform your source Observable onCompleted() events as onNext() (with void), you should return Observable that emits onNext() which signals to resubscribe to your source Observable - meaning repeat the operation. While onCompleted()/onError() will be delivered as onCompleted()/onError() on your source Observable. recommended reading regarding repeatWhen/retryWhen.

    One thing to consider, as repeatWhen() will basically swallows all your onCompleted events (as you're repeating the operation there is no onCompleted(), your Observable will not stop from by itself!), then you should gather and update the adapter differently, I guess you can simply use toList() to gather all items to single onNext() (a replacement to your success() logic) and then on each onNext updates the list (what you're doing on onCompleted right now), to sum it up:

     Observable.fromIterable(URLList)
                .concatMap(url -> standartRequest(App.getInstance().getApi().getService().getData(currency.getUrl())))
                .retry(Constants.RETRY_COUNT)
                .timeout(Constants.TIMEOUT_IN_SECONDS, TimeUnit.SECONDS)
                .toList()
                .repeatWhen(completed -> completed.delay(5, TimeUnit.SECONDS))
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(this::valuesRetrieved, this::error);
    

    EDIT:

    Your timeout and retry logic are applied to the entire operation chain, so if all the network requests together take more than Constants.TIMEOUT_IN_SECONDS you will get timeout exception, you probably just want to retry and time out each individual request. like this:

    Observable.fromIterable(URLList)
                .concatMap(url ->  standartRequest(App.getInstance()
                        .getApi().getService().getData(currency.getUrl())
                        .retry(Constants.RETRY_COUNT)
                        .timeout(Constants.TIMEOUT_IN_SECONDS, TimeUnit.SECONDS)))                
                .toList()
                .repeatWhen(completed -> completed.delay(5, TimeUnit.SECONDS))
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(this::valuesRetrieved, this::error);
    
    0 讨论(0)
  • 2021-01-03 16:11

    I am repeating my retrofit call every 2 second after it is completed

    //Retrofit Builder
            val retrofitBuilder = Retrofit.Builder()
                .addConverterFactory(GsonConverterFactory.create())
                .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
                .baseUrl("http://worldtimeapi.org/")
                .build()
    
            val timeApi = retrofitBuilder.create(TimeApi::class.java)
    
    
        val timeObservable = timeApi.getTime()
    
        timeObservable.subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .repeatWhen { completed -> completed.delay(2, TimeUnit.SECONDS) }
            .subscribe(object : Observer<Time> {
                override fun onComplete() {
                    Log.e("MainActivity", "It is completed")
                }
    
                override fun onSubscribe(d: Disposable) {
                    Log.e("MainActivity", "you have successfully subscribed ")
                }
    
                override fun onNext(t: Time) {
                    progress.visibility = View.INVISIBLE
                    txtTime.text = t.unixtime
                    Log.e("MainActivity", "OnNext Called" + t.unixtime)
    
                }
    
                override fun onError(e: Throwable) {
                    Log.e("MainActivity", "ERROR")
                }
            })
    
    }
    

    See the Log Cat , onNext is called after every 2 second.

    0 讨论(0)
提交回复
热议问题