2013-06-04 21 views
8

Desidero utilizzare Volley's NetworkImageView per caricare immagini dalla mia API REST che richiede l'autorizzazione HTTP di base. Quindi ho bisogno di aggiungere intestazioni alla richiesta HTTP.Android Volley ImageLoader - Come utilizzare l'autorizzazione HTTP di base?

Ho fatto la seguenti approcci:

Override Request.getHeaders() - come descritto nella this question. Questo va bene, ma il problema è che ImageLoader ha new ImageRequest() hardcoded quindi non posso passare l'implementazione Request a ImageLoader e non può essere ereditata e ottimizzata facilmente (il metodo che avrei bisogno di reimplement utilizza proprietà private).

La soluzione è modificare la libreria Volley stessa (cosa che vorrei evitare).

Utilizzare HttpClientStack personalizzato - come descritto here. Utilizzando questo approccio sarei in grado di intercettare la comunicazione HTTP e aggiungere le intestazioni necessarie. Ma penso che questo non sia il modo giusto di fare: perderei la selezione automatica di HttpClient by Volley (Gingerbread vs. HC e IC).


C'è qualche modo più semplice per ottenere questo che mi manca?

risposta

6

Ho già sostituito getHeaders(). Finora non ho trovato un modo per farlo più facilmente.

Vedere questo esempio https://github.com/njzk2/VolleyTwitter/blob/master/src/com/njzk2/twitterbrowser/TokenRequest.java di una richiesta annullata per includere l'intestazione Autorizzazione.

Dal codice di Volley, non vedo alcun modo di aggiungere intestazioni personalizzate se non sovrascrivendo l'oggetto Richiesta.

Inoltre, non vedo come possa essere facilmente aggiunto data la struttura di Volley, come per le immagini, ImageRequests sono creati da ImageLoader.

Se dovessi modificare Volley per consentire ciò, rendere possibile l'utilizzo di una classe personalizzata estende ImageRequest in ImageLoader. Tuttavia, la classe ImageRequest anonima in ImageLoader lo rende un po 'complicato.

+0

Grazie per la risposta. È un peccato che non esista un modo più semplice. Lo farò nel modo che hai suggerito: modificando ImageLoader per utilizzare la classe ImageRequest personalizzata (creando e passando a ImageLoader a ImageRequestFactory). Se ho ragione, gli anonimi sono solo ascoltatori passati a ImageRequest, non a ImageRequest stesso, quindi non dovrebbe essere un problema. – lopisan

+0

c'è un ImageRequest anonimo per chiamare onGetImageSuccess (cacheKey, response); in onResponse (anche se lo avrei messo direttamente in ImageRequest, o anche in Request.) – njzk2

8

Penso che gli stack HTTP siano la strada da percorrere. Non c'è perdita della selezione automatica di HttpClient se si eseguono le sostituzioni in base alla versione dell'SDK, esattamente come fa Volley.

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.GINGERBREAD) { 
     HurlStack stack = new HurlStack() { 
      @Override 
      public HttpResponse performRequest(Request<?> request, Map<String, String> headers) 
       throws IOException, AuthFailureError { 

       headers.putAll(MyApp.getAuthParams()); 

       return super.performRequest(request, headers); 
      } 
     }; 

     requestQueue = Volley.newRequestQueue(getApplicationContext(), stack); 

    } else { 
     HttpClientStack stack = new HttpClientStack(AndroidHttpClient.newInstance("volley/0")) { 
      @Override 
      public HttpResponse performRequest(Request<?> request, Map<String, String> headers) 
       throws IOException, AuthFailureError { 

       headers.putAll(MyApp.getAuthParams()); 

       return super.performRequest(request, headers); 
      } 
     }; 

     requestQueue = Volley.newRequestQueue(getApplicationContext(), stack); 
    } 

Vedere Volley source (riga 53).

+1

Soluzione molto pulita. ;) – multiholle

+1

Come parte del rilascio di Android M, classe HttpResponse rimossa da sdk – Bytecode

Problemi correlati