2016-04-10 24 views
13

Bir projede AutoValue (ve android-apt eklentisi) çalışıyorum ve AutoRalue için Ryan Harter'in gson uzantısının farkındayım, ancak retrofit 2'yi uzatma ve fabrika yöntemini kullanmak için nasıl bağlarım? soyut sınıf?Retrofit 2 ile AutoValue nasıl kullanılır?

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

mesela burada değişmezlik uygulamak ama nasıl değişmez, AutoValue modeli sınıfına Sonradan montaj (ya da belki daha spesifik GSON) kanca do signin'i JSON modeli nesnesi ile AutoValue kullanmak istersiniz? https://github.com/rharter/auto-value-gson

Ben bu gibi çalışması yapmak mümkün oldu:

cevap

26

[güncelleme] kütüphane biraz daha burada kontrol değişti. Umarım bu sana yardımcı olur. senin gradle uygulama dosyasında

  • İthalat

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

  • autovalue ile nesne oluşturun:

    @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); 
        } 
    } 
    
  • sizin Tipi Adaptör Fabrika oluşturun (versiyon> 0.3.0 kullanıyorsanız atla)

    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; 
        } 
    } 
    
  • Enjoy

    GsonConverterFactory gsonConverterFactory = GsonConverterFactory.create(
         new GsonBuilder() 
           .registerTypeAdapterFactory(new AutoValueGsonTypeAdapterFactory()) 
           .create()); 
    
  • Retrofit retrofit = new Retrofit 
         .Builder() 
         .addConverterFactory(gsonConverterFactory) 
         .baseUrl("http://url.com/") 
         .build() 
    
  • isteğinizi yapın sizin güçlendirme oluşturucu bunu ekleyin GsonBuilder ile GSON dönüştürücü oluşturma

Bon canlı şablon:
Otomatik değer sınıfınızda avtypeadapter yazın ve sonra tür bağdaştırıcısı kodunu oluşturmak için otomatik tamamlayın. Çalışmak için bunu live template in Android Studio olarak eklemeniz gerekir.

Live template configuration

public static TypeAdapter<$class$> typeAdapter(Gson gson) { return new AutoValue_$class$.GsonTypeAdapter(gson); } 
nasıl oluşturulur ve canlı bir şablon kullanın.

Live template gif

+0

müthiş bir açıklama, bunu takdir ediyorum. Çalıştığım parçanın çoğu var ama AutoValueGsonTypeAdapterFactory bulamıyorum. "Hata: (40, 57) hatası: AutoValueGsonTypeAdapterFactory sembol sınıfını bulamıyor" – 3xplore

+0

TypeAdapterFactory'yi uygulayan soyut bir sınıfta @GsonTypeAdapterFactory kullanmanız gerekir. Orada kontrol edin https://github.com/rharter/auto-value-gson#factory –

2

İşte https://gist.github.com/JakeWharton/0d67d01badcee0ae7bc9

benim için büyük İşleri GSON ile çalışan gerektiren sadece size AutoValue sınıfların tüm ek açıklama eklemek gerektiren bir GSON TypeAdapterFactory Jake Wharton tarafından bir Gist bu.

Burada .. de bazı proguard yardım var

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