Moshi JsonAdapter处理翻新中的Observable <Bitmap>

时间:2019-12-30 17:34:52

标签: android retrofit moshi

当前,我正在通过以下方式解码Bitmap

@GET("api/users/get_avatar/{userId}/default.png")
fun getAvatar(@Header("ApiToken") apiToken: String, @Path("userId") userId: String): Observable<ResponseBody>

并在ViewModel中对其进行解码

val avatar = it()?.let { body ->
   val stream = body.byteStream()
   BitmapFactory.decodeStream(stream)
}

但是,我想将其用于更优雅的Moshi JsonAdapter。

我的通话如下:

@GET("api/users/get_avatar/{userId}/default.png")
fun getAvatar(@Header("ApiToken") apiToken: String, @Path("userId") userId: String): Observable<Bitmap>

我要添加适配器:

return Moshi.Builder()
        .add(BitmapAdapter())

但是,很可能我的适配器是错误的:

private class BitmapAdapter {

    @ToJson
    fun toJson(value: Bitmap): String {
        return value.encodeBase64()
    }

    @FromJson
    fun fromJson(value: String): Bitmap {
        return value.decodeBase64()
    }
}

它看起来如何?

1 个答案:

答案 0 :(得分:1)

Moshi用​​于解析JSON,而不是直接解码图像。如果您想从翻新客户那里获得Bitmap,则希望Converter.Factory直接提供给翻新。

示例:

import android.graphics.Bitmap
import android.graphics.BitmapFactory
import okhttp3.ResponseBody
import retrofit2.Converter
import retrofit2.Retrofit
import java.lang.reflect.Type

class BitmapConverterFactory : Converter.Factory() {

    override fun responseBodyConverter(type: Type, annotations: Array<Annotation>, retrofit: Retrofit): Converter<ResponseBody, *>? {
        return if (type == Bitmap::class.java) {
            Converter<ResponseBody, Bitmap> {
                value -> BitmapFactory.decodeStream(value.byteStream())
            }
        } else {
            null
        }
    }
}

并在实例化Retrofit实例的任何地方提供它:

Retrofit.Builder()
    .baseUrl("https://myapi.com")
    .addConverterFactory(BitmapConverterFactory())
    .addConverterFactory(MoshiConverterFactory.create())
    .build()

编辑:我最初在BitmapCoverterFactory中犯了一个错误。 type最初与Bitmap::javaClass进行比较,应该为Bitmap::class.java