Moshi JsonAdapter 在 Retrofit 中处理 Observable<Bitmap>
Moshi JsonAdapter to handle Observable<Bitmap> in Retrofit
目前,我正在按以下方式解码 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()
}
}
它应该是什么样子?
Moshi 用于解析 JSON,而不是直接解码图像。如果您想从 Retrofit 客户那里获得 Bitmap
,您需要 Converter.Factory
直接提供给 Retrofit。
示例:
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
.
目前,我正在按以下方式解码 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()
}
}
它应该是什么样子?
Moshi 用于解析 JSON,而不是直接解码图像。如果您想从 Retrofit 客户那里获得 Bitmap
,您需要 Converter.Factory
直接提供给 Retrofit。
示例:
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
.