Android Volley ImageLoader-如何使用基本HTTP授权?
我想使用Volley的Android Volley ImageLoader-如何使用基本HTTP授权?,android,android-volley,Android,Android Volley,我想使用Volley的NetworkImageView从我的RESTAPI加载需要基本HTTP授权的图像。所以我需要向HTTP请求添加头 我采用了以下方法: 覆盖请求.getHeaders()-如中所述。 这很好,但问题是ImageLoader具有newimagerequest()硬编码,因此我无法将Request实现传递到ImageLoader中,并且无法轻松继承和调整(我需要重新实现的方法使用私有属性) 解决方案是修改Volley库本身(我希望避免) 使用自定义HttpClientStack
NetworkImageView
从我的RESTAPI加载需要基本HTTP授权的图像。所以我需要向HTTP请求添加头
我采用了以下方法:
覆盖请求.getHeaders()
-如中所述。
这很好,但问题是ImageLoader
具有newimagerequest()
硬编码,因此我无法将Request
实现传递到ImageLoader
中,并且无法轻松继承和调整(我需要重新实现的方法使用私有属性)
解决方案是修改Volley库本身(我希望避免)
使用自定义HttpClientStack-如前所述。
使用这种方法,我将能够拦截HTTP通信并添加必要的头。但我认为这不是正确的方法——我会通过截击(姜饼vs.HC和IC)放弃对HttpClient的自动选择
是否有更简单的方法来实现我所缺少的功能?我也重写了
getHeaders()
。到目前为止,我还没有找到一种更容易做到这一点的方法
请参见此覆盖请求的示例,以包括授权标头
从凌乱的代码中,我看不到任何添加自定义头的方法,如果不是重写请求对象的话
此外,考虑到截击的结构,我不知道如何轻松添加它,至于图像,ImageRequests是由ImageLoader创建的
如果我修改了Volley以允许这样做,那么我就可以在ImageLoader中使用自定义类extendsImageRequest。不过,ImageLoader中的匿名ImageRequest类使它有点复杂。我认为HTTP堆栈是一种可行的方法。如果您根据SDK版本进行覆盖,则不会丢失HttpClient的自动选择,就像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);
}
if(Build.VERSION.SDK\u INT>=Build.VERSION\u code.gingerbrand){
HurlStack stack=新的HurlStack(){
@凌驾
公共HttpResponse性能请求(请求、请求、映射头)
抛出IOException、AuthFailureError{
headers.putAll(MyApp.getAuthParams());
返回super.performRequest(请求、标题);
}
};
requestQueue=Volley.newRequestQueue(getApplicationContext(),堆栈);
}否则{
HttpClientStack=newHttpClientStack(AndroidHttpClient.newInstance(“volley/0”)){
@凌驾
公共HttpResponse性能请求(请求、请求、映射头)
抛出IOException、AuthFailureError{
headers.putAll(MyApp.getAuthParams());
返回super.performRequest(请求、标题);
}
};
requestQueue=Volley.newRequestQueue(getApplicationContext(),堆栈);
}
请参阅(第53行)。谢谢您的回复。遗憾的是,没有比这更简单的方法了。我将按照您建议的方式进行—修改ImageLoader以使用自定义ImageRequest类(通过创建ImageRequestFactory并将其传递给ImageLoader)。如果我是对的,匿名只是传递给ImageRequest的侦听器,而不是ImageRequest本身,所以这应该不是问题;在onResponse中(尽管我会直接将其放入ImageRequest,甚至是Request中。)非常简洁的解决方案作为Android M版本的一部分,HttpResponse类从sdk中删除