2015-11-03 17 views
15

Dalla risposta di @keke Wharton, è necessario chiamare sempre restAdapter.create una sola volta e riutilizzare la stessa istanza di MyTaskService ogni volta che è necessario interagire con. Non posso sottolineare abbastanza questo. È possibile utilizzare il modello di singleton regolare per garantire che ci sia sempre una singola istanza di questi oggetti che si utilizza ovunque. Un framework di iniezione delle dipendenze sarebbe anche qualcosa che potrebbe essere usato per gestire queste istanze, ma sarebbe un po 'eccessivo se non lo si sta già utilizzando.Come utilizzare il retrofit come un singleton mentre si utilizza il convertitore gson?

questo è il mio codice

public class MusicApi { 
private static final String API_URL = "https://itunes.apple.com"; 
private static MusicApiInterface sMusicApiInterface; 

public static MusicApiInterface getApi() { 
    if (sMusicApiInterface == null) { 
     sMusicApiInterface = null; 
     RestAdapter restAdapter = new RestAdapter.Builder() 
       .setEndpoint(API_URL) 
       .build(); 

     sMusicApiInterface = restAdapter.create(MusicApiInterface.class); 
    } 
    return sMusicApiInterface; 
} 

public interface MusicApiInterface { 
    @GET("/search?entity=musicVideo") 
    NetworkResponse getMusic(@Query("term") String term); 

    @GET("/search?entity=musicVideo") 
    void getMusic(@Query("term") String term, Callback<NetworkResponse> networkResponseCallback); 

    @GET("/search?entity=musicVideo") 
    Observable<NetworkResponse> getMusicObservable(@Query("term") String term); 
} 

}

tutto funziona bene. Sto usando un adattatore di tipo, per ogni richiesta ho bisogno di creare diversi tipi di analisi di gson e impostazione in adattatore.

Gson gson = new GsonBuilder().registerTypeAdapter(DiscussionViewMoreContainer.class, new ExplorerDeserializerJson()) 
      .create(); 

mi fa che devo creare un nuovo restadapter ogni volta. Nella mia app alcune richieste sono parallele. Questo è il modo corretto?

+0

* mi fa che devo creare un nuovo restadapter ogni volta. * Perché? – Blackbelt

+0

@Blackbelt dopo aver effettuato l'adattatore di riposo come singleton.how imposterai il convertitore gson in restadpater. Creerai un nuovo generatore di riposo e lo imposterai? – Asthme

risposta

10

non si deve creare ogni volta, ma solo una volta, quando si crea la RestAdapter:

public static MusicApiInterface getApi() { 
    if (sMusicApiInterface == null) { 
     Gson gson = new GsonBuilder() 
      .registerTypeAdapter(DiscussionViewMoreContainer.class, new ExplorerDeserializerJson()) 
      .create(); 
     RestAdapter restAdapter = new RestAdapter.Builder() 
      .setEndpoint(API_URL) 
      .setConverter(new GsonConverter(gson)) 
      .build(); 
     sMusicApiInterface = restAdapter.create(MusicApiInterface.class); 
    } 
    return sMusicApiInterface; 
} 

se avete bisogno di registrare più di un Deserializer, basta chiamare. registerTypeAdapter più volte con la coppia Class/TypeToken e l'istanza della dogana Deserializer. Gson chiamerà quello corretto in base al tipo di ritorno del metodo di retrofit che stai chiamando. E.

Gson gson = new GsonBuilder() 
      .registerTypeAdapter(DiscussionViewMoreContainer.class, new ExplorerDeserializerJson()) 
      .registerTypeAdapter(OtherModelClass.class, new OtherModelClassDeserializerJson()) 
      .registerTypeAdapter(OtherModelClass3.class, new OtherModelClass3DeserializerJson()) 
+0

ho una classe diversa per l'adattatore typer di registro. Esempio – Asthme

+0

Ho un diverso set di adattatori di tipo, Gson gson = new GsonBuilder(). RegisterTypeAdapter (GalleryContainer.class, new ExplorerDeserializerJson()) .create(); ... Come wil registrati la prossima volta? – Asthme

+2

puoi chiamare 'registerTypeAdapter' più volte. – Blackbelt

Problemi correlati