我正在制作一个简单的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
的目的。这是我订阅可观察...的地方。
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)
}
}
对于发出这些请求的工作方式,我一定有误解。以及如何正确设置日志记录拦截器
编辑:
在添加Internet权限并对我的可观察对象进行了一些更改并在拦截器上执行.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个列表项,没有达到。
答案 0 :(得分:1)
您的adapter.addItems(list!!)
在流块之外。您不应该通过副作用来更新用户界面。由于您的api请求将在io线程池中的其他线程上进行,因此在api调用完成之前,您的适配器很可能会使用空列表进行更新。
您应该做的是在subscribe({})
块中更新适配器。
此外,您不应强行打开可为空的列表。您应该在kotlin中执行的操作是像在Java中那样用空检查将其包装起来,或者使用类似list?.let{ list ->}