2013-06-04 2 views
8

Ich möchte Volley's NetworkImageView verwenden, um Bilder von meiner REST-API zu laden, die eine einfache HTTP-Autorisierung benötigt. Also muss ich der HTTP-Anfrage Header hinzufügen.Android Volley ImageLoader - Wie grundlegende HTTP-Autorisierung zu verwenden?

Ich habe folgende Ansätze hergestellt:

Aufschalten Request.getHeaders() - wie in this question beschrieben. Das wäre in Ordnung, aber das Problem ist, dass ImageLoader hat new ImageRequest() hardcoded, so kann ich nicht meine Request Implementierung in ImageLoader übergeben und es kann nicht leicht geerbt werden und optimiert (die Methode, die ich neu implementieren müsste verwendet private Eigenschaften).

Die Lösung ist, Volley-Bibliothek selbst zu ändern (was ich vermeiden möchte).

Verwenden Sie benutzerdefinierte HttpClientStack - wie beschrieben here. Mit diesem Ansatz wäre ich in der Lage, HTTP-Kommunikation abzufangen und notwendige Header hinzuzufügen. Aber ich denke, das ist nicht der richtige Weg - ich würde die automatische Auswahl von HttpClient durch Volley (Gingerbread vs. HC und IC) verlieren.


Gibt es eine einfachere Möglichkeit, dies zu erreichen, die ich vermisse?

Antwort

6

Ich habe auch getHeaders() außer Kraft gesetzt. Bisher habe ich keinen Weg gefunden, das einfacher zu machen.

Siehe dieses Beispiel https://github.com/njzk2/VolleyTwitter/blob/master/src/com/njzk2/twitterbrowser/TokenRequest.java einer überschriebenen Anforderung zum Einschließen des Autorisierungsheaders.

Aus Volley-Code sehe ich keine Möglichkeit zum Hinzufügen von benutzerdefinierten Headern, wenn nicht durch Überschreiben des Request-Objekts.

Darüber hinaus sehe ich nicht, wie es leicht hinzugefügt werden kann angesichts der Struktur von Volley, wie für die Bilder, ImageRequests von der ImageLoader erstellt werden.

Wenn ich Volley ändern würde, um dies zu ermöglichen, würde ich es ermöglichen, eine benutzerdefinierte Klasse extends ImageRequest im ImageLoader zu verwenden. Die anonyme ImageRequest-Klasse in ImageLoader macht es jedoch etwas kompliziert.

+0

Vielen Dank für Ihre Antwort. Es ist schade, dass es keinen einfacheren Weg gibt. Ich mache es so, wie Sie es vorgeschlagen haben - durch die Änderung von ImageLoader, um die benutzerdefinierte ImageRequest-Klasse zu verwenden (indem Sie eine ImageRequestFactory erstellen und an ImageLoader übergeben). Wenn ich recht habe, sind die anonymen Listener nur an ImageRequest und nicht an ImageRequest selbst, also sollte das kein Problem sein. – lopisan

+0

gibt es eine anonyme ImageRequest zum Aufrufen von GetImageSuccess (cacheKey, Antwort); in onResponse (obwohl ich das direkt in ImageRequest oder sogar in Anfrage gestellt hätte.) – njzk2

8

Ich denke, HTTP-Stacks sind der Weg zu gehen. Es gibt keinen Verlust der automatischen HttpClient-Auswahl, wenn Sie Ihre Überschreibungen basierend auf der SDK-Version ausführen, genau wie bei 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); 
    } 

Siehe Volley source (Zeile 53).

+1

Sehr saubere Lösung. ;) – multiholle

+1

Als Teil der Android M-Version wurde die HttpResponse-Klasse aus sdk entfernt – Bytecode