Kotlin通用列表解析

时间:2018-04-16 06:50:48

标签: android kotlin android-databinding kotlin-extension rx-kotlin

我正在寻找其他问题,但这个问题使用了不同的方法。

我在Android应用中使用MVVM。

实际上,这是我从服务器获取数据的方式:

  • 将dataManager注入viewModel。
  • viewModel调用dataManager-> fetchUsers
  • fetchUsers向服务器发出请求并返回一个Observable of Some,在这种情况下应该是几个,但它是通用的。
  • viewModel订阅此请求并期望有几个。
  • 此时一切正常,除了几个没有用户列表。这几个有LinkedTreeMap列表

enter image description here

我尝试更改我的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的几个对象?

0 个答案:

没有答案