2015-03-28 17 views
8

Recentemente ho iniziato a sviluppare un app Android e ha deciso di utilizzare Retrofit come un client di un servizio REST, ma non sono sicuro se il mio approccio è buono:chiamata Retrofit all'interno AsyncTask

i. Ho implementato una chiamata asincrona alla mia API, che viene chiamata all'interno del metodo doInBackground di AsyncTask. Il riguarda: aver letto this article mi ha confuso. Non sono AsyncTasks adatti a questo tipo di attività? Devo effettuare la chiamata all'API direttamente dall'attività? Comprendo che i metodi di callback di Retrofit sono eseguiti sul thread dell'interfaccia utente, ma che dire della chiamata su HTTP? Retrofit crea thread per questo?

ii. Voglio che AuthenticationResponse venga salvato all'interno di un oggetto SharedPreferences, che non sembra essere disponibile all'interno del metodo di successo del callback. Qualche suggerimento/buona pratica?

Grazie in anticipo :)

Ecco il mio doInBackGroundMethod:

@Override 
    protected String doInBackground(String... params) { 
     Log.d(LOCATION_LOGIN_TASK_TAG, params[0]); 

     LocationApi.getInstance().auth(new AuthenticationRequest(params[0]), new Callback<AuthenticationResponse>() { 

      @Override 
      public void success(AuthenticationResponse authenticationResponse, Response response) { 
       Log.i("LOCATION_LOGIN_SUCCESS", "Successfully logged user into LocationAPI"); 
      } 

      @Override 
      public void failure(RetrofitError error) { 
       Log.e("LOCATION_LOGIN_ERROR", "Error while authenticating user in the LocationAPI", error); 
      } 
     }); 
     return null; 
    } 

risposta

27

I. Retrofit supporta tre modi per fare una richiesta:

  • sincronico

È devi dichiarare il metodo che restituisce la risposta come valore per ex Ampio:

@GET("/your_endpoint") 
    AuthenticationResponse auth(@Body AuthenticationRequest authRequest); 

Questo metodo viene eseguito nel thread in cui è chiamato. Quindi non è possibile chiamare nel thread principale/dell'interfaccia utente.

  • asincrono

Si deve dichiarare metodo vuoto che contiene callback con contenuto ultimo param per esempio:

@GET("/your_endpoint") 
    voud auth(@Body AuthenticationRequest authRequest, Callback<AuthenticationResponse> callback); 

L'esecuzione di richiesta viene chiamato nel nuovo filo di fondo, e la i metodi di callback vengono eseguiti nel thread in cui viene chiamato il metodo. Quindi puoi chiamare questo metodo nel thread principale/dell'interfaccia utente senza nuovo thread/AsyncTask.

  • Utilizzando RxAndroid

L'ultimo modo che conosco è il metodo che utilizza RxAndroid. Devi dichiarare il metodo che restituisce la risposta come osservabile con valore. Ad esempio:

@GET("/your_endpoint") 
    Observable<AuthenticationResponse> auth(@Body AuthenticationRequest authRequest); 

Questo metodo supporta anche la richiesta di rete in una nuova discussione. Quindi non devi creare un nuovo thread/AsyncTask. Il callback Azione1 dal metodo subscribe viene chiamato nell'interfaccia utente/thread principale.

II. Puoi chiamare il tuo metodo solo in Attività e puoi scrivere i tuoi dati su SharedPreferences come mostrato di seguito:

SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(context); 
sharedPreferences.edit() 
      .put...//put your data from AuthenticationResponse 
        //object which is passed as params in callback method. 
      .apply(); 
+0

Grazie mille per la tua risposta Konrad. Non ero sicuro di cosa stesse facendo Retrofit dietro le quinte.All'inizio stavo facendo la chiamata di rete in un AsyncTask che è un po 'eccessivo e difficile accedere all'istanza SharedPreferences. Risposta molto buona e informativa – user3159152

+0

Benvenuto Sono felice di poterti aiutare. Se è utile per te, per favore accettalo. Contrassegna la casella di controllo –

+0

spiegazione molto buona. – Andrain