【发布时间】: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