Android Moshi JsonAdapter在改造中处理可观察的

Android Moshi JsonAdapter在改造中处理可观察的,android,retrofit,moshi,Android,Retrofit,Moshi,目前,我正在以以下方式解码位图: @GET("api/users/get_avatar/{userId}/default.png") fun getAvatar(@Header("ApiToken") apiToken: String, @Path("userId") userId: String): Observable<ResponseBody> 然而,我想使用更优雅的Moshi JsonAdapter 我的电话看起来像: @GET("api/users/get_avatar/

目前,我正在以以下方式解码位图:

@GET("api/users/get_avatar/{userId}/default.png")
fun getAvatar(@Header("ApiToken") apiToken: String, @Path("userId") userId: String): Observable<ResponseBody>
然而,我想使用更优雅的Moshi JsonAdapter

我的电话看起来像:

@GET("api/users/get_avatar/{userId}/default.png")
fun getAvatar(@Header("ApiToken") apiToken: String, @Path("userId") userId: String): Observable<Bitmap>
但是,我的适配器很可能是错误的:

private class BitmapAdapter {

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

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

它应该是什么样子?

Moshi用于解析JSON,而不是直接解码图像。如果您想从改造客户机获取位图,您需要一个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
        }
    }
}

编辑:我最初在BitmapCoverterFactory中犯了一个错误。类型的比较最初是针对Bitmap::javaClass的,它应该是Bitmap::class.java。

不幸的是,我仍然受到以下问题的影响:java.lang.IllegalArgumentException:Platform class android.graphics.Bitmap不带注释需要在com.squareup.moshi.ClassJsonAdapter$1.createClassJsonAdapter.java:60在com.squareup.moshi.moshi.adapterMoshi.java:137 at添加时,com.squareup.moshi.moshi.adapterMoshi.java:97BitmapConverterFactory@qbait订单很重要。当您使用构建器实例化改造实例时,BitmapConverterFactory应该位于MoshiConverterFactory之前。否则Moshi converter工厂将试图接管。@qbait我在BitmapConverterFactory中也犯了一个错误,我在答案中对其进行了更新。很好,它可以通过两个小更改工作:Bitmap::class.java而不是BuffereImage::class.java,我需要向转换器添加类型。非常感谢!哦,对不起!我在我的机器上用纯Kotlin no Android做了一个例子,所以我用BuffereImage代替位图。很高兴它成功了!
private class BitmapAdapter {

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

    @FromJson
    fun fromJson(value: String): Bitmap {
        return value.decodeBase64()
    }
}
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.Builder()
    .baseUrl("https://myapi.com")
    .addConverterFactory(BitmapConverterFactory())
    .addConverterFactory(MoshiConverterFactory.create())
    .build()