【问题标题】:How to use RxJava2 and Retrofit2 in Android Kotlin如何在 Android Kotlin 中使用 RxJava2 和 Retrofit2
【发布时间】:2020-12-14 19:20:51
【问题描述】:

现在我正在开发一个想要使用 Retrofit2 和 RxJava2 读取 JSON API 的 android 项目。 我找到了一个示例,但是当我这样做时程序输出 OnFailure 消息 和异常:E/Surface: getSlotFromBufferLocked:未知缓冲区:0xe84f0220.

在清单中,我添加了 Android Permission INTERNET。 对不起很多代码( 也许它会在未来帮助某人)。 如果您知道如何修复此错误,请告诉我,或者如果您有优秀文章的链接,说明如何在 Kotlin Android 中正确使用 RxJava2 和 Retrofit2,请在此处发布。

下面是我的代码。

-- MainActivity 类

package com.example.rxjava

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.util.Log
import android.widget.Toast
import io.reactivex.android.schedulers.AndroidSchedulers
import io.reactivex.disposables.CompositeDisposable
import io.reactivex.schedulers.*

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val compositeDisposable = CompositeDisposable()
        compositeDisposable.add(
            ServiceBuilder.buildService().getDataList()
                .observeOn(AndroidSchedulers.mainThread())
                .subscribeOn(Schedulers.io())
                .subscribe({response ->
                    onResponse(response)
                },{t ->
                    onFailure(t)
                })
        )
    }

    private fun onFailure(t: Throwable) {
        runOnUiThread {
            Toast.makeText(applicationContext, "Failure", Toast.LENGTH_SHORT).show()
        }
    }

    private fun onResponse(response: DataListModel) {
//        Log.e("TAG: ", response.items)
        val SIZE = response.items?.size
        for(i in 0..SIZE!! - 1) {
            Log.e("TAG: ", response.items[i].id.toString())
        }
    }
}

--ServiceBuilder类

package com.example.rxjava

import okhttp3.OkHttpClient
import retrofit2.Retrofit
import retrofit2.adapter.rxjava2.RxJava2CallAdapterFactory
import retrofit2.converter.gson.GsonConverterFactory

object ServiceBuilder {
    private val client = OkHttpClient
        .Builder()
        .build()

    private val retrofit = Retrofit.Builder()
        .baseUrl("http://jsonplaceholder.typicode.com")
        .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
        .addConverterFactory(GsonConverterFactory.create())
        .client(client)
        .build()
        .create(GetData::class.java)

    fun buildService(): GetData {
        return retrofit
    }
}

--获取数据类

package com.example.rxjava

import io.reactivex.Observable
import retrofit2.http.GET

interface GetData {
    @GET("/posts/1/comments")
    fun getDataList(): Observable<DataListModel>
}

--DataListModel(序列化类)

package com.example.rxjava

import com.google.gson.annotations.SerializedName

data class DataListModel(
    val items: ArrayList<UserItemsList>? = null
)

data class UserItemsList(
    @SerializedName("userId")
    val userId: String? = null,

    @SerializedName("id")
    val id: Int = 0,

    @SerializedName("title")
    val title: String? = null,

    @SerializedName("body")
    val body: String? = null
)

【问题讨论】:

  • E/Surface 可能不是您的应用程序的问题,而只是一些 logcat 背景辐射。在您的 onFailure 中查看异常本身(例如记录异常),以了解更多关于哪里出了问题。

标签: android-studio kotlin retrofit2 rx-java2


【解决方案1】:

我怀疑问题出在这里(过去我也发生过几次):

.baseUrl("http://jsonplaceholder.typicode.com")

根据文档:

public Retrofit.Builder baseUrl(okhttp3.HttpUrl baseUrl) ...

基本 URL 应始终以 / 结尾。

尾随 / 确保端点值是相对路径 将正确地将自己附加到具有路径组件的基础。

正确: 基本网址:http://example.com/api/ 端点:foo/bar/ 结果: http://example.com/api/foo/bar/

不正确: 基本网址:http://example.com/api 端点:foo/bar/ 结果: http://example.com/foo/bar/

此方法强制 baseUrl 有一个尾随 /。

您的 baseUrl 缺少尾随 /,应该是:

.baseUrl("http://jsonplaceholder.typicode.com/")

同时更新您的代码以将错误记录到控制台,然后您应该在日志中看到它是哪个特定错误(很可能是我上面提到的那个):

...
{t ->
    Log.e("Failure", t.message)
    onFailure(t)
}

否则,您的 rx 代码似乎没问题。

更新

您应该检查您的数据模型是否设计正确。 http://jsonplaceholder.typicode.com/posts/1/comments 返回项目列表:

{
    "postId": 1,
    "id": 1,
    "name": "id labore ex et quam laborum",
    "email": "Eliseo@gardner.biz",
    "body": "..."
}

即没有标题或用户 ID

【讨论】:

    猜你喜欢
    • 2021-04-09
    • 2018-03-09
    • 2019-06-20
    • 1970-01-01
    • 2017-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-05
    相关资源
    最近更新 更多