12

我已经在一个项目中使用了 AutoValue(和 android-apt 插件),并且我知道 Ryan Harter 的 AutoValue 的 gson 扩展,但是我如何挂钩 Retrofit 2 以在抽象类上使用扩展和工厂方法?

String grantType = "password";
Call<SignIn> signInCall = retrofitApi.signIn(email, password, grantType);
signInCall.enqueue(callback);

例如,在这里我想使用带有 SignIn JSON 模型对象的 AutoValue 来强制执行不变性,但是我如何将 Retrofit(或者更具体地说是 Gson)连接到不可变的 AutoValue 模型类?

4

2 回答 2

26

[更新] 库发生了一些变化,请在此处查看更多内容:https ://github.com/rharter/auto-value-gson

我能够让它像这样工作。我希望它会帮助你。

  • 导入您的 gradle 应用程序文件

    apt 'com.ryanharter.auto.value:auto-value-gson:0.3.1'

  • 使用自动值创建对象:

    @AutoValue public abstract class SignIn {    
        @SerializedName("signin_token") public abstract String signinToken();
        @SerializedName("user") public abstract Profile profile();
    
        public static TypeAdapter<SignIn> typeAdapter(Gson gson) {
            return new AutoValue_SignIn.GsonTypeAdapter(gson);
        }
    }
    
  • 创建您的类型适配器工厂(如果使用版本 > 0.3.0,请跳过)

    public class AutoValueGsonTypeAdapterFactory implements TypeAdapterFactory {
    
        public <T> TypeAdapter<T> create(Gson gson, TypeToken<T> type) {
            Class<? super T> rawType = type.getRawType();
    
            if (rawType.equals(SignIn.class)) {
                return (TypeAdapter<T>) SignIn.typeAdapter(gson);
            } 
    
            return null;
        }
    }
    
  • 使用 GsonBuilder 创建 Gson 转换器

    GsonConverterFactory gsonConverterFactory = GsonConverterFactory.create(
            new GsonBuilder()
                    .registerTypeAdapterFactory(new AutoValueGsonTypeAdapterFactory())
                    .create());
    
  • 将其添加到您的改造构建器中

    Retrofit retrofit = new Retrofit
            .Builder()
            .addConverterFactory(gsonConverterFactory)
            .baseUrl("http://url.com/")
            .build()
    
  • 做你的要求

  • 享受

额外的实时模板:
在您的自动值类中,键入 avtypeadapter 然后自动完成以生成类型适配器代码。要工作,您需要将其添加为Android Studio 中的实时模板

public static TypeAdapter<$class$> typeAdapter(Gson gson) {
    return new AutoValue_$class$.GsonTypeAdapter(gson);
}

实时模板配置

如何创建和使用实时模板。

实时模板 gif

于 2016-04-12T20:41:08.773 回答
2

这是 Jake Wharton 为 Gson TypeAdapterFactory 编写的 Gist,它只需要您向所有需要使用 Gson 的 AutoValue 类添加注释 https://gist.github.com/JakeWharton/0d67d01badcee0ae7bc9

对我很有用。

这里也有一些proguard帮助..

-keep class **.AutoValue_*
-keepnames @yourpackage.AutoGson class *
于 2016-09-04T07:52:50.770 回答