Подтвердить что ты не робот

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

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

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

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

4b9b3361

Ответ 1

[обновление] Библиотека немного изменилась, подробнее здесь: https://github.com/rharter/auto-value-gson

Я смог заставить его работать так. Надеюсь, это поможет вам.

  • Импорт в файл приложения gradle

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

  • Создать объект с autovalue:

    @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);
        }
    }
    
  • Создайте свой типовой адаптер Factory (Пропустите, если используете версию > 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()
    
  • Сделайте свой запрос

  • Enjoy

Бонусный живой шаблон:
В вашем классе autovalue введите avtypeadapter, затем автозаполнение, чтобы сгенерировать код адаптера типа. Для работы вам нужно добавить это как живой шаблон в Android Studio.

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

Конфигурация живых шаблонов

Как создать и использовать живой шаблон.

Живой шаблон gif

Ответ 2

Здесь Gist by Jake Wharton для Gson TypeAdapterFactory, который просто требует добавления аннотации ко всем вашим классам AutoValue, которые требуют работы с Gson https://gist.github.com/JakeWharton/0d67d01badcee0ae7bc9

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

Здесь тоже поможет проглард..

-keep class **.AutoValue_*
-keepnames @yourpackage.AutoGson class *