通常使用Moshi进行JSON解码的流程改造回调

时间:2019-04-26 19:40:48

标签: android generics kotlin retrofit moshi

我正在利用Retrofit + Moshi为应用程序设置网络层,它将具有约40个网络请求,所有这些请求均以一致的格式返回JSON数据。因此,我想重用处理$invoke.name | Select-String -Pattern ^puppet_.*\:\:'(\w+)'\:\:'(\w+)'$ | foreach {$_.Matches.Groups[1].Value} | Sort-Object | Unique` 中的onFailureonResponse的代码。

例如,后端可能返回以下内容:

成功:

Callback<T>

错误:

{
    "result" {
        "count": 0
    },
    "error": null
}

请注意,{ "result" null, "error": { "message": "Some user-friendly error message here." } } 的内容对于每个成功请求都会有所不同,并且成功和错误情况的状态码均为200。

我目前有一个要求正在反序列化为以下类别:

"result"

我发出请求并像这样处理它

@JsonClass(generateAdapter = true)
data class SampleWrapper(
    val error: APIError?,
    val result: Sample?
)

@JsonClass(generateAdapter = true)
data class Sample(
    val count: Int
)

并在活动中调用此函数:

fun requestSample(context: Context, callback: (Sample?, String?) -> Unit) {
    service.sample.enqueue(object : Callback<SampleWrapper> {
        //TODO: Use a generic function to handle these and pass back Sample? and String?
        override fun onFailure(call: Call<SampleWrapper>, t: Throwable) {
            callback(null, t.message?: context.getString(R.string.unexpected_error_message))
        }

        override fun onResponse(call: Call<SampleWrapper>, response: Response<SampleWrapper>) {
            if (response.isSuccessful && response.body() != null && response.body()?.error == null) {
                callback(response.body()!!.result, null)
            } else {
                callback(null, response.body()?.error?.message?: context.getString(R.string.unexpected_format_error_message))
            }
        }
    })
}

我现在想重用响应处理,因为除了回调中传递的对象类型之外,所有请求都将完全相同。看来我基本上需要处理Networking.requestSample(this) { sample, errorMessage -> //work with sample or handle error } ,其中Callback<T>包含Terror的值,但是也许我需要使该包装对象通用。我正在努力弄清楚如何实现这一目标。本质上,我想简化该函数,以便为每个需要定义的请求都简洁,因此我们不会将重复的代码重复40倍,例如:

result

0 个答案:

没有答案