通过改造返回网络呼叫上的可观察值



>我正在制作一个简单的回收器视图列表,其中包含从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,当我去调试时,它会在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)
}
}

我一定误解了提出这些请求的工作原理。以及如何正确设置日志记录拦截器

编辑:

添加互联网权限并对我的可观察对象进行一些更改并在我的拦截器上执行.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 个列表项未到达。

您的adapter.addItems(list!!)在流块之外。不应通过副作用更新 UI。由于您的 api 请求将位于 io 线程池中的其他线程上,因此您的适配器很可能会在 api 调用完成之前使用空列表更新自身。

您应该做的是更新subscribe({})块内的适配器。

此外,不应强制解开可空列表的包装。在 kotlin 中你应该做的是要么像在 Java 中那样用空检查来包装它,要么像这样使用 let 运算符list?.let{ list ->}

相关内容

  • 没有找到相关文章

最新更新