2016-04-10 13 views
13

Ich habe AutoValue (und das Android-Apt-Plugin) in einem Projekt arbeiten, und ich bin bewusst Ryan Harter's Gson-Erweiterung für AutoValue, aber wie hake ich Retrofit 2 bis die Erweiterung und Factory-Methode auf dem verwenden abstrakte Klasse? (Oder vielleicht genauer gesagt Gson) an die unveränderlichen, Autovalue ModellklasseWie verwende ich AutoValue mit Retrofit 2?

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

zB hier würde Ich mag Autovalue mit dem SignIn JSON Modellobjekt verwenden Unveränderlichkeit zu erzwingen, aber wie ich oben Retrofit Haken?

Antwort

26

[Update] Die Bibliothek haben sich ein wenig geändert, überprüfen Sie hier mehr: https://github.com/rharter/auto-value-gson

konnte ich es so arbeiten. Ich hoffe es hilft dir.

  • Import in Ihrer gradle App Datei

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

  • Objekt mit Autowert erstellen:

    @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); 
        } 
    } 
    
  • Erstellen Sie Ihren Typ Adapter Factory (Überspringen, wenn Version mit> 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; 
        } 
    } 
    
  • Erstelle deinen Gson Konverter mit Ihrem GsonBuilder

    GsonConverterFactory gsonConverterFactory = GsonConverterFactory.create(
         new GsonBuilder() 
           .registerTypeAdapterFactory(new AutoValueGsonTypeAdapterFactory()) 
           .create()); 
    
  • es zu einem Retrofit-Builder hinzufügen

    Retrofit retrofit = new Retrofit 
         .Builder() 
         .addConverterFactory(gsonConverterFactory) 
         .baseUrl("http://url.com/") 
         .build() 
    
  • Sie Ihre Anfrage

  • Genießen

Bon Live-Vorlage:
Geben Sie in Ihrer Autovalue-Klasse avtypeadapter ein und vervollständigen Sie sie automatisch, um den Typ-Adaptercode zu generieren. Um zu arbeiten, müssen Sie dies als live template in Android Studio hinzufügen.

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

Live template configuration

Wie die Live-Vorlage erstellen und zu verwenden.

Live template gif

+0

große Erklärung, es zu schätzen wissen. Ich habe den Großteil des Teils funktioniert, aber ich kann AutoValueGsonTypeAdapterFactory nicht finden.Halten Sie diesen Fehler „Fehler: (40, 57) Fehler: kann nicht Symbolklasse AutoValueGsonTypeAdapterFactory finden“ immer – 3xplore

+0

Sie haben verwenden @GsonTypeAdapterFactory auf eine abstrakte Klasse, die TypeAdapterFactory implementiert. Überprüfen Sie es dort https://github.com/rharter/auto-value-gson#factory –

2

Hier ist ein Gist von Jake Wharton für eine Gson TypeAdapterFactory, die nur erfordert, dass Sie eine Anmerkung, um alle Ihre Autovalue Klassen hinzufügen, die mit Gson Arbeit erfordern https://gist.github.com/JakeWharton/0d67d01badcee0ae7bc9

gut für mich funktioniert.

Hier einige proguard Hilfe auch ..

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