2013-06-04 11 views
8

Chcę użyć Volley'a NetworkImageView do załadowania obrazów z mojego interfejsu REST API, który wymaga podstawowej autoryzacji HTTP. Muszę więc dodać nagłówki do żądania HTTP.Android Volley ImageLoader - Jak korzystać z podstawowej autoryzacji HTTP?

Zrobiłem się następującymi metodami:

Override Request.getHeaders() - jak opisano w this question. To byłoby w porządku, ale problem polega na tym, że ImageLoader ma new ImageRequest() na stałe, więc nie mogę przekazać mojej implementacji Request do ImageLoader i nie można go łatwo odziedziczyć i zmodyfikować (metoda, której potrzebuję do ponownego zastosowania, używa właściwości prywatnych).

Rozwiązaniem jest modyfikacja samej biblioteki Volley (czego chciałbym uniknąć).

Użyj niestandardowego pliku HttpClientStack - zgodnie z opisem here. Korzystając z tego podejścia, będę w stanie przechwycić komunikację HTTP i dodać niezbędne nagłówki. Ale myślę, że nie jest to właściwy sposób - straciłbym automatyczny wybór HttpClient przez Volley (Gingerbread vs. HC and IC).


Czy jest jakiś prostszy sposób na osiągnięcie tego, czego mi brakuje?

Odpowiedz

6

Mam również overriden getHeaders(). Do tej pory nie znalazłem sposobu, aby łatwiej to zrobić.

Zobacz przykład https://github.com/njzk2/VolleyTwitter/blob/master/src/com/njzk2/twitterbrowser/TokenRequest.java nadpisanego żądania włączenia nagłówka autoryzacji.

Nie widzę żadnego sposobu dodania nagłówków niestandardowych, jeśli nie przesłonię obiektu Żądanie.

Co więcej, nie widzę sposobu, w jaki można go łatwo dodać ze względu na strukturę Volley, jak w przypadku obrazów, ImageRequests są tworzone przez ImageLoader.

Gdybym miał zmodyfikować Volley, aby to umożliwić, pozwoliłbym na użycie niestandardowej klasy rozszerzającej ImageRequest w ImageLoader. Anonimowa klasa ImageRequest w ImageLoader sprawia jednak, że jest nieco skomplikowana.

+0

Dziękuję za odpowiedź. Szkoda, że ​​nie istnieje prostsza droga. Zrobię to tak, jak zasugerowałeś - modyfikując ImageLoader, aby użyć niestandardowej klasy ImageRequest (tworząc i przekazując ImageLoaderowi ImageRequestFactory). Jeśli mam rację, anonimowi są tylko słuchacze przekazani do ImageRequest, a nie ImageRequest, więc nie powinno to stanowić problemu. – lopisan

+0

jest anonimowy ImageRequest do wywołania onGetImageSuccess (cacheKey, odpowiedź); w onResponse (chociaż umieściłbym to bezpośrednio w ImageRequest, a nawet w Request). – njzk2

8

Myślę, że stosy HTTP są drogą do zrobienia. Nie ma utraty automatycznego wyboru HttpClient, jeśli dokonujesz przesłonięć na podstawie wersji SDK, dokładnie tak, jak robi to 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); 
    } 

Zobacz Volley source (linia 53).

+1

Bardzo zadbane rozwiązanie. ;) – multiholle

+1

W ramach wydania Android M, klasa HttpResponse została usunięta z sdk – Bytecode

Powiązane problemy