Как использовать AutoValue с Retrofit 2?

У меня есть AutoValue (и плагин android-apt), работающий в проекте, и я знаю о расширении gson Райана Хартера для AutoValue, но как мне подключить Retrofit 2, чтобы использовать расширение и фабричный метод в абстрактном классе ?

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

например, здесь я хотел бы использовать AutoValue с объектом модели SignIn JSON для обеспечения неизменности, но как мне подключить Retrofit (или, возможно, более конкретно Gson) к неизменяемому классу модели AutoValue?


person Ollie C    schedule 10.04.2016    source источник


Ответы (2)


[обновление] Библиотека немного изменилась, подробнее см. здесь: 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;
        }
    }
    
  • Создайте свой конвертер Gson с помощью GsonBuilder

    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

person Vincent D.    schedule 12.04.2016

Вот Gist Джейка Уортона для Gson TypeAdapterFactory, который просто требует, чтобы вы добавили аннотацию ко всем вашим классам AutoValue, которые требуют работы с Gson https://gist.github.com/JakeWharton/0d67d01badcee0ae7bc9

Отлично работает для меня.

Вот некоторая помощь proguard тоже ..

-keep class **.AutoValue_*
-keepnames @yourpackage.AutoGson class *
person kassim    schedule 04.09.2016