Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/198.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android Volley ImageLoader-如何使用基本HTTP授权?_Android_Android Volley - Fatal编程技术网

Android Volley ImageLoader-如何使用基本HTTP授权?

Android Volley ImageLoader-如何使用基本HTTP授权?,android,android-volley,Android,Android Volley,我想使用Volley的NetworkImageView从我的RESTAPI加载需要基本HTTP授权的图像。所以我需要向HTTP请求添加头 我采用了以下方法: 覆盖请求.getHeaders()-如中所述。 这很好,但问题是ImageLoader具有newimagerequest()硬编码,因此我无法将Request实现传递到ImageLoader中,并且无法轻松继承和调整(我需要重新实现的方法使用私有属性) 解决方案是修改Volley库本身(我希望避免) 使用自定义HttpClientStack

我想使用Volley的
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中删除