我正在制作一个简单的 recyclerview 列表,其中包含从 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
上的 Client 类中崩溃。我没有得到与网络调用有关的信息,而我认为 OkHttpClient Interceptor
的用途。这是我订阅 observable 的地方...
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!!)
在流 block 之外。你不应该通过副作用更新你的用户界面。由于您的 api 请求将在 io 线程池的其他线程上,因此您的适配器很可能会在您的 api 调用完成之前使用空列表更新自身。
您应该做的是在 subscribe({})
block 中更新您的适配器。
此外,您不应该强制解包可为空的列表。你应该在 kotlin 中做的是像在 Java 中那样用 null 检查包装它,或者像这样使用 let 运算符 list?.let{ list ->}
关于android - 通过改造在网络调用上返回 Observable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52088516/