2016-04-10 3 views
13

J'ai AutoValue (et le plugin android-apt) dans un projet, et je connais l'extension gson de Ryan Harter pour AutoValue, mais comment raccorder Retrofit 2 pour utiliser l'extension et la méthode d'usine sur le classe abstraite?Comment utiliser AutoValue avec Retrofit 2?

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

par exemple ici, je voudrais utiliser AutoValue avec l'objet modèle SignIn JSON pour faire appliquer immuabilité mais comment puis-je brancher Retrofit (ou peut-être plus particulièrement Gson) à la classe de modèle immuable, AutoValue?

Répondre

26

[mise à jour] La bibliothèque ont un peu changé, vérifiez plus ici: https://github.com/rharter/auto-value-gson

j'ai pu le faire fonctionner comme ça. J'espère que ça t'aidera.

  • Importer dans votre fichier app gradle

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

  • Créer objet avec 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); 
        } 
    } 
    
  • Créer votre adaptateur type usine (Passer si vous utilisez la version> 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; 
        } 
    } 
    
  • Créez votre convertisseur Gson avec votre GsonBuilder

    GsonConverterFactory gsonConverterFactory = GsonConverterFactory.create(
         new GsonBuilder() 
           .registerTypeAdapterFactory(new AutoValueGsonTypeAdapterFactory()) 
           .create()); 
    
  • Ajoutez à votre constructeur de rénovation

    Retrofit retrofit = new Retrofit 
         .Builder() 
         .addConverterFactory(gsonConverterFactory) 
         .baseUrl("http://url.com/") 
         .build() 
    
  • Faites votre demande

  • Profitez

Bon nous live template:
Dans votre classe autovalue, tapez avtypeadapter puis autocomplete pour générer le code de l'adaptateur de type. Pour travailler, vous devez ajouter ceci comme live template in Android Studio.

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

Live template configuration

Comment créer et utiliser le modèle direct.

Live template gif

+0

grande explication, apprécier. J'ai la plupart de la partie fonctionnante mais je ne peux pas trouver AutoValueGsonTypeAdapterFactory.Continuer à obtenir cette erreur "Erreur: (40, 57) erreur: impossible de trouver la classe de symboles AutoValueGsonTypeAdapterFactory" – 3xplore

+0

Vous devez utiliser @GsonTypeAdapterFactory sur une classe abstraite qui implémente TypeAdapterFactory. Vérifiez-le ici https://github.com/rharter/auto-value-gson#factory –

2

est ici un Gist par Jake Wharton pour une Gson TypeAdapterFactory qui vient vous oblige ajouter une annotation à toutes vos classes Autovalue qui nécessitent de travailler avec Gson https://gist.github.com/JakeWharton/0d67d01badcee0ae7bc9

fonctionne très bien pour moi.

est ici une aide PROGUARD trop ..

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