2016-04-10 17 views
13

Ho AutoValue (e il plugin per Android-apt) che lavora in un progetto, e sono a conoscenza dell'estensione gson di Ryan Harter per AutoValue, ma come faccio ad agganciare Retrofit 2 per usare l'estensione e il metodo factory sul classe astratta?Come utilizzare AutoValue con Retrofit 2?

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

esempio qui vorrei utilizzare Valore automatico con l'oggetto del modello SignIn JSON per far rispettare l'immutabilità, ma come faccio a collegare Retrofit (o forse più precisamente GSON) al immutabili, Valore automatico classe del modello?

risposta

26

[update] La biblioteca sono cambiate un po ', controllare di più qui: https://github.com/rharter/auto-value-gson

sono stato in grado di farlo funzionare in questo modo. Spero ti possa aiutare.

  • di importazione nel vostro file app Gradle

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

  • creare l'oggetto con Valore automatico:

    @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); 
        } 
    } 
    
  • Create il vostro tipo adattatore di fabbrica (Salta se si utilizza la versione> 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; 
        } 
    } 
    
  • Crea il tuo convertitore GSON con il GsonBuilder

    GsonConverterFactory gsonConverterFactory = GsonConverterFactory.create(
         new GsonBuilder() 
           .registerTypeAdapterFactory(new AutoValueGsonTypeAdapterFactory()) 
           .create()); 
    
  • aggiungerlo al vostro costruttore retrofit

    Retrofit retrofit = new Retrofit 
         .Builder() 
         .addConverterFactory(gsonConverterFactory) 
         .baseUrl("http://url.com/") 
         .build() 
    
  • fare la vostra richiesta

  • Godetevi

Bon noi modello live:
Nella classe di autovalore, digitare avtypeadapter, quindi eseguire il completamento automatico per generare il codice dell'adattatore del tipo. Per funzionare è necessario aggiungerlo come live template in Android Studio.

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

Live template configuration

Come creare e utilizzare il modello dal vivo.

Live template gif

+0

grande spiegazione, apprezzarlo. La maggior parte della parte funziona ma non riesco a trovare AutoValueGsonTypeAdapterFactory.Continua a ricevere questo errore "Errore: (40, 57) errore: impossibile trovare la classe di simboli AutoValueGsonTypeAdapterFactory" – 3xplore

+0

Devi usare @GsonTypeAdapterFactory su una classe astratta che implementa TypeAdapterFactory. Controlla lì https://github.com/rharter/auto-value-gson#factory –

2

Ecco un Gist da Jake Wharton per una GSON TypeAdapterFactory che richiede solo di aggiungere un'annotazione per tutte le classi Valore automatico che richiedono lavorare con GSON https://gist.github.com/JakeWharton/0d67d01badcee0ae7bc9

grandi opere per me.

Ecco qualche aiuto Proguard troppo ..

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