我正在寻找其他问题,但这个问题使用了不同的方法。
我在Android应用中使用MVVM。
实际上,这是我从服务器获取数据的方式:
我尝试更改我的dataManager以返回一个字符串,然后在我的viewModel中映射响应,但事实是我必须在每个请求中都这样做。
此外,我尝试在我的dataManager中映射请求,但我得到了相同的链接树映射数组。
TypeToken方法的一点是我必须在我的viewModel中映射。
已更新
UsersViewModel
private fun fetchUsers() {
isLoading.set(false)
compositeDisposable += dataManager.GET<User>(classJava = User::class)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe( { response ->
isLoading.set(false)
// Here the response should be a several with a list of users.
}, { err ->
isLoading.set(false)
})
}
GET功能:
override fun <T> GET(classJava: KClass<*>): Single<Several<T>> {
return Rx2AndroidNetworking.get("EndPoint")
.addHeaders("Authorization", apiHeader.protectedAPIHeader.accessToken!!)
.setOkHttpClient(APIClient.getUnsafeClient())
.build()
// Also I tested with
// .getObjectSingle(Several::class.java) // The thing is that I can't assign the type <T> with this approach.
.stringSingle
.map {
val fromJSON = fromJson<Several<T>>(it)
fromJSON
}
}
fromJson function:
inline fun <reified T> fromJson(json: String): T = Gson().fromJson(json, object: TypeToken<T>() {}.type)
Several.kt
data class Several<T>(val items: MutableList<T>)
如果我更改我的GET函数以返回一个String,那么在UsersViewModel中我添加一个像这样的.map
private fun fetchUsers() {
isLoading.set(false)
compositeDisposable += dataManager.GET<User>(classJava = User::class)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.map(
val severalUsers = fromJson<Several<User>>(it)
severalUsers
)
.subscribe( { response ->
isLoading.set(false)
// usersLiveData.value = response
}, { err ->
Log.e("tag", "Ocurred some error")
isLoading.set(false)
})
}
然后我会按预期获得一个用户列表,但我不想做的是在UsersViewModel中映射响应,因为我必须在每个期望项目列表的请求中执行。
有没有什么方法可以在我的viewmodel中找到没有map的几个对象?