2013-06-04 25 views
8

VolleyのNetworkImageViewを使用して、基本HTTP認証が必要なREST APIから画像をロードしたいとします。だから私はHTTPリクエストにヘッダを追加する必要があります。 - this questionで説明したようにAndroid Volley ImageLoader - 基本的なHTTP認証の使い方

オーバーライドRequest.getHeaders()

私は、次のアプローチを作ってきました。 これは問題ありませんが、ImageLoaderにはnew ImageRequest()がハードコードされていますので、私はRequestの実装をImageLoaderに渡すことはできません。簡単に継承したり調整したりすることはできません。

解決策は、Volleyライブラリ自体を修正することです(避けたいもの)。

カスタムHttpClientStackを - hereと記述してください。 この方法を使用すると、私はHTTPコミュニケーションを傍受し、必要なヘッダーを追加することができます。しかし、これは正しい方法ではないと思います。私はVolley(Gingerbread vs. HC and IC)のHttpClientの自動選択を緩くします。


これは私が行方不明になっているいくつかの簡単な方法はありますか?

答えて

6

getHeaders()もオーバーライドしました。これまでのところ、私はそれをより簡単に行う方法を見つけていません。

は、Authorizationヘッダを含むようにオーバーライドリクエストこの例https://github.com/njzk2/VolleyTwitter/blob/master/src/com/njzk2/twitterbrowser/TokenRequest.javaを参照してください。

ボレーコードからは、Requestオブジェクトをオーバーライドしないとカスタムヘッダーを追加する方法がありません。

また、私はそれが簡単にバレーボールの構造与え追加することができる方法を見ていない、イメージ用として、ImageRequestsがImageLoaderによって作成されます。

私はこれを許可するようにバレーボールを変更した場合、私はそれが可能なカスタムクラスを使用するようになるだろうがImageLoaderでImageRequestを拡張します。 ImageLoaderの匿名のImageRequestクラスはそれを少し複雑にします。

+0

ご返信ありがとうございます。単純な方法が存在しないことは残念です。 ImageLoaderを変更してカスタムImageRequestクラス(ImageLoaderを作成してImageRequestFactoryに渡す)を使用して、私が提案したようにします。私が正しいとすれば、匿名者は、ImageRequest自体にではなく、ImageRequestに渡されるリスナーだけなので、問題ではありません。 – lopisan

+0

匿名のImageRequestがonGetImageSuccess(cacheKey、response)を呼び出すことがあります。 onResponseで(ImageRequestに直接置いても、リクエストでさえも) – njzk2

8

私はHTTPスタックが行く方法だと思います。 Volleyとまったく同じように、SDKのバージョンに基づいてオーバーライドを行うと、自動的にHttpClientの選択が失われることはありません。

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); 
    } 

Volley source(行53)を参照してください。

+1

非常にきれいな解決策です。 ;) – multiholle

+1

Android Mリリースの一環として、HttpResponseクラスがsdkから削除されました – Bytecode

関連する問題