android - 通过改造在网络调用上返回 Observable

标签 android retrofit rx-java2 okhttp

我正在制作一个简单的 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/

相关文章:

android - 重复的 FCM 推送通知

android - 当 API 关闭时改造 SocketTimeoutException 错误

android - RxJava 和改造的单元测试

android - 双击 onBack 的 Rxjava 以完成 Activity

android - pdf以编程方式在android中图像

java - 如何将整数数组从 AsyncTask 获取到同一 Activity 中的另一个方法?

android - 改造房间模型映射

java - 请求中的改造和常量参数

rx-java2 - RxJava2 as()、to() 和 compose() 之间的区别

android - 我可以在同一帐户的 Firebase 控制台中使用当前数据将应用程序从当前项目移动到另一个项目吗