【发布时间】:2019-09-21 02:53:38
【问题描述】:
我有一个用 Kotlin 编写的 Android 应用程序,它从 API 获取数据,现在它只是一个本地托管的 JSON 文件。当我尝试获取数据时,我收到错误,即我的列表 people 未初始化,因此 people == null 并且没有收到数据。我不确定我做错了什么以及如何解决这个问题。
型号
data class Person (
@Json(name = "personId")
val personId: Int,
@Json(name = "personName")
val name: String,
@Json(name = "personAge")
val age: Int,
@Json(name = "isFemale")
val isFemale: Boolean,
)
JSON 响应
{
"persons": [{
"personId": 1,
"personName": "Bert",
"personAge": 19,
"isFemale": "false",
}
]
}
ApiClient
class ApiClient {
companion object {
private const val BASE_URL = "http://10.0.2.2:3000/"
fun getClient(): Retrofit {
val moshi = Moshi.Builder()
.add(customDateAdapter)
.build()
return Builder()
.baseUrl(BASE_URL)
.addConverterFactory(MoshiConverterFactory.create(moshi))
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.build()
}
}
}
改造 http 方法
interface ApiInterface {
@GET("persons")
fun getPersons(): Observable<List<Person>>
}
最后是通话
class PersonActivity: AppCompatActivity(){
private lateinit var jsonAPI: ApiInterface
private lateinit var persons: List<Person>
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_person)
val retrofit = ApiClient.getClient()
jsonAPI = retrofit.create(ApiInterface::class.java)
jsonAPI.getPersons()
.subscribeOn(Schedulers.io())
.unsubscribeOn(Schedulers.computation())
.observeOn(AndroidSchedulers.mainThread())
.subscribe({ persons = it })
}
}
预期:JSON 文件中的数据进入人员列表而不是 NULL。
【问题讨论】:
-
您的响应不是人员列表,而是对象“人员”,该对象具有一个..许多人员对象。
-
@GiorgosNeokleous 那么我怎样才能得到一个列表呢?我尝试添加 PersonResponse { lateinit var data: List
} 但它没有用 -
我将在下面以答案格式发布它
标签: android kotlin retrofit rx-java2 moshi