Возврат Наблюдаемого при Сетевых вызовах с модернизацией - PullRequest
0 голосов
/ 30 августа 2018

Я делаю простой список переработчиков с элементами, возвращенными из API. У меня есть мой модифицированный клиент

open class CoinListRetroFit {

val httpLoggingInterceptor = HttpLoggingInterceptor()
val okHttpClient = OkHttpClient.Builder()
        .readTimeout(1000, TimeUnit.SECONDS)
        .addInterceptor(httpLoggingInterceptor)
        .build()


private val retroFit: Retrofit = Retrofit.Builder()
        .baseUrl(" https://api.coinmarketcap.com/v2/")
        .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
        .addConverterFactory(GsonConverterFactory.create())
        .client(okHttpClient)
        .build()

val coinList: LuckyCoinApiService = retroFit.create(LuckyCoinApiService::class.java)

У меня есть сервис и клиент Api, который делает звонок

interface LuckyCoinApiService {

@GET("listings/")
fun getCoinListing() : Observable<CoinListResponse>

}

class LuckyCoinApiClient : CoinListRetroFit() {

fun getCoins(): Observable<List<CoinListItem>> =
        coinList.getCoinListing().map { response ->
            response.cryptoList
        }

}

Теперь ниже, где я подписываюсь на наблюдаемый и заполняю мой список, однако он возвращает null, и когда я иду на отладку, он падает в классе Client на coinList.getCoinListing. Мне не дают никакой информации, касающейся сетевых вызовов, для которых я думал, что OkHttpClient Interceptor. Здесь я подписываюсь на наблюдаемое ...

  addDisposable(LuckyCoinApiClient()
            .getCoins()
            .compose(ObservableTransformer { upstream: Observable<List<CoinListItem>> ->
                upstream
                        .subscribeOn(Schedulers.io())
                        .observeOn(AndroidSchedulers.mainThread())
            })
            .subscribe({ response ->
                list = response
                adapter.addItems(list!!)
            },
                    { _ ->
                        Log.e("CoinListController", "Error retrieving list!!")
                    }))
}



    fun addDisposable(disposable: Disposable) {
    if (compositeDisposable == null) {
        compositeDisposable = CompositeDisposable(disposable)
    } else {
        compositeDisposable!!.add(disposable)
    }
}

Должно быть, я что-то неправильно понимаю, как работают эти запросы. А также как правильно настроить перехватчик логирования

EDIT:

После добавления интернет-разрешений и внесения некоторых изменений в моё наблюдаемое и выполнения .setLevel() на моем перехватчике. Теперь я вижу сетевой вызов в LogCat и получаю ожидаемый ответ 200 OK со списком ..

Однако теперь ответ останавливается на

    08-30 15:06:25.446 5214-5238/com.example.luckycoins D/OkHttp:             "id": 3238, 
08-30 15:06:25.446 5214-5238/com.example.luckycoins D/OkHttp:             "name": "ABCC Token", 
08-30 15:06:25.446 5214-5238/com.example.luckycoins D/OkHttp:             "symbol": "AT", 
08-30 15:06:25.446 5214-5238/com.example.luckycoins D/OkHttp:             "website_slug": "abcc-token"
08-30 15:06:25.446 5214-5238/com.example.luckycoins D/OkHttp:         }, 
08-30 15:06:25.446 5214-5238/com.example.luckycoins D/OkHttp:         {
08-30 15:06:25.446 5214-5238/com.example.luckycoins D/OkHttp:             "id": 3239, 

останавливается на этом id без чтения его атрибутов. Также осталось 2-3 элемента списка, которых он не достиг.

1 Ответ

0 голосов
/ 30 августа 2018

Ваш adapter.addItems(list!!) находится вне блока потока. Вы не должны обновлять свой интерфейс побочным эффектом. Поскольку ваш запрос API будет на других потоках из пула потоков IO, ваш адаптер, скорее всего, обновит себя с нулевым списком до завершения ваших вызовов API.

Что вам нужно сделать, это обновить адаптер внутри блока subscribe({}).

Кроме того, вы не должны принудительно развертывать обнуляемый список. В kotlin вы должны либо обернуть его пустой проверкой, как в Java, либо использовать оператор let, например, list?.let{ list ->}

...