2016-04-10 22 views
13

Mam AutoValue (i wtyczkę Android-apt) pracującą w projekcie i jestem świadomy rozszerzenia gon Ryana Hartera dla AutoValue, ale jak mam podłączyć Retrofit 2, aby użyć rozszerzenia i metody fabrycznej na Klasa abstrakcyjna?Jak korzystać z AutoValue z Retrofit 2?

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

np tutaj chciałbym używać AutoValue z modelu obiektowego signin JSON egzekwować niezmienność ale jak mam podłączyć Retrofit (albo dokładniej Gson) do niezmiennego, AutoValue klasy modelu?

Odpowiedz

26

[aktualizacja] Biblioteka zmieniły się nieco więcej, sprawdź tutaj: https://github.com/rharter/auto-value-gson

udało mi się zrobić to działa w ten sposób. Mam nadzieję, że ci to pomoże.

  • importu w Gradle plik app

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

  • Tworzenie obiektu z 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); 
        } 
    } 
    
  • Stwórz swój typ Adapter Factory (Przejdź w przypadku korzystania z wersji> 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; 
        } 
    } 
    
  • Tworzenie konwertera Gson z GsonBuilder

    GsonConverterFactory gsonConverterFactory = GsonConverterFactory.create(
         new GsonBuilder() 
           .registerTypeAdapterFactory(new AutoValueGsonTypeAdapterFactory()) 
           .create()); 
    
  • dodać go do modernizacji budowniczego

    Retrofit retrofit = new Retrofit 
         .Builder() 
         .addConverterFactory(gsonConverterFactory) 
         .baseUrl("http://url.com/") 
         .build() 
    
  • Czy żądania

  • Zapraszamy

Bon nam szablon na żywo: W swojej klasie autovalue wpisz avtypeadapter, a następnie autouzupełnianie, aby wygenerować kod adaptera typu. Aby pracować, musisz dodać to jako live template in Android Studio.

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

Live template configuration

Jak tworzyć i korzystać z szablonu na żywo.

Live template gif

+0

wielki wyjaśnienie, to doceniam. Mam większość części pracy, ale nie jestem w stanie znaleźć AutoValueGsonTypeAdapterFactory.Ciągle otrzymuję ten błąd "Błąd: (40, 57) błąd: nie można znaleźć klasy symboli AutoValueGsonTypeAdapterFactory" – 3xplore

+0

Musisz użyć @GsonTypeAdapterFactory na abstrakcyjnej klasie, która implementuje TypeAdapterFactory. Sprawdź to https://github.com/rharter/auto-value-gson#factory –

2

Oto Gist Jake Wharton dla Gson TypeAdapterFactory że po prostu wymaga dodawania adnotacji do wszystkich klas AutoValue które wymagają pracy z Gson https://gist.github.com/JakeWharton/0d67d01badcee0ae7bc9

działa dobrze dla mnie.

Oto niektóre PROGUARD pomaga zbyt ..

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