项目中用Fresco来管理图片由于服务器图片有不同的版本需要根据客户端的屏幕密度来选择不同的图片共享一份用OkHttp下载图片并添加HTTP头代码。

public class OkHttpNetworkFetcher extends BaseNetworkFetcher{

    private static OkHttpClient mOkClient;

    private Map<String, Call> mCallMap;

    private Context     mAppContext;

    static {
mOkClient = new OkHttpClient.Builder()
// .addNetworkInterceptor(new HttpLoggingInterceptor().setLevel(HttpLoggingInterceptor.Level.HEADERS))
.build();
} public OkHttpNetworkFetcher(Context mAppContext) {
this.mAppContext = mAppContext;
} @Override
public FetchState createFetchState(Consumer consumer, ProducerContext producerContext) {
return new FetchState(consumer, producerContext);
} @Override
public void fetch(FetchState fetchState,final Callback callback) { final Request request = buildRequest(fetchState);
Call fetchCall = mOkClient.newCall(request); if(mCallMap == null)
mCallMap = new HashMap<>(); mCallMap.put(fetchState.getId(), fetchCall); final String fetchId = fetchState.getId(); fetchState.getContext().addCallbacks(new BaseProducerContextCallbacks(){
@Override
public void onCancellationRequested() {
cancelAndRemove(fetchId);
callback.onCancellation();
}
}); try {
Response response = fetchCall.execute();
ResponseBody responseBody = response.body();
callback.onResponse(responseBody.byteStream(), (int) responseBody.contentLength());
} catch (IOException e) {
callback.onFailure(e);
} removeCall(fetchId);
} private void removeCall(String id){
if(mCallMap != null){
mCallMap.remove(id);
}
} private void cancelAndRemove(String id){
if(mCallMap != null){
Call call = mCallMap.remove(id);
if(call != null)
call.cancel();
}
} private Request buildRequest(FetchState fetchState){
DisplayMetrics dm = mAppContext.getResources().getDisplayMetrics();
int density = dm.densityDpi; return new Request.Builder()
.addHeader("x-density", String.valueOf(density))
.get()
.url(fetchState.getUri().toString())
.build(); } }



《架构文摘》每天一篇架构领域重磅好文,涉及一线互联网公司应用架构(高可用、高性 能、高稳定)、大数据、机器学习等各个热门领域。

Fresco添加HTTP请求头的更多相关文章

  1. java swagger ui 添加header请求头参数

    我用到的swagger 主要有三款产品,swagger editor,swagger ui 和swagger codegen. swagger editor:主要是一个本地客户端,用来自己添加api, ...

  2. 修改或添加HTTP请求头

    1.Cookie的修改 (一)cookie长什么样 cookie是一个个键值对(“键=值”的形式)加上分号空格隔开组合而成, 形如: "name1=value1; name2=value2; ...

  3. Android系列之网络(二)----HTTP请求头与响应头

    ​[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/ ...

  4. (二)----HTTP请求头与响应头

    一.HTTP头引入: 正确的设置HTTP头部信息有助于搜索引擎判断网页及提升网站访问速度.通常HTTP消息包括:客户机向服务器的请求消息和服务器向客户机的响应消 息.客户端向服务器发送一个请求,请求头 ...

  5. HTTP 请求头中的 Remote_Addr,X-Forwarded-For,X-Real-IP

    REMOTE_ADDR 表示发出请求的远程主机的 IP 地址,remote_addr代表客户端的IP,但它的值不是由客户端提供的,而是服务端根据客户端的ip指定的,当你的浏览器访问某个网站时,假设中间 ...

  6. ajax请求头加Token时发生的跨域(CORS)请求问题

    首先描述下问题:需求是在请求头中加入token,我在ajax请求数据时添加了请求头‘Authorization’字段,并添加了响应的token值,在请求数据的时候浏览器报错如下: Request he ...

  7. 四种为HttpClient添加默认请求报头的解决方案

    HttpClient在Web调用中具有广泛的应用,而为它添加默认请求头是我们经常遇到的需求,本文介绍4种为HttpClient添加默认请求头的方式. 第一种方式 直接在创建的HttpClient对象的 ...

  8. java 修改HttpServletRequest的参数或请求头

    场景:过滤器中获取参数Token并添加到请求头(用户认证兼容老系统) 请求头和请求参数是不能直接修改,也没有提供修改的方法,但是可以在过滤器和拦截器中使用HttpServletRequestWrapp ...

  9. http header详解,HTTP头、请求头、响应头、实体头

    Content-Language,Content-Length,Content-Type,Content-Encoding,mime分析 Accept 指定客户端能够接收的内容类型 Accept:te ...

随机推荐

  1. 安装hadoop集群--hdfs

    安装hadoop集群--hdfs 大数据软件 链接:https://pan.baidu.com/s/1-3PYLHMgvvONawJq55hstQ 提取码:izqf 准备一台干净的虚拟机-centos ...

  2. java四种引用及在LeakCanery中应用

    java 四种引用 Java4种引用的级别由高到低依次为: StrongReference > SoftReference > WeakReference > PhantomRefe ...

  3. Nginx入门(一):在centos上安装nginx

    CenterOS7安装Nginx =================== 参考:https://www.xuliangwei.com/bgx/972.html nginx官网下载地址:http://n ...

  4. HelloDjango 第 13 篇:分类、归档和标签页

    作者:HelloGitHub-追梦人物 文中涉及的示例代码,已同步更新到 HelloGitHub-Team 仓库 侧边栏已经正确地显示了最新文章列表.归档.分类.标签等信息.现在来完善归档.分类和标签 ...

  5. springboot之swagger快速启动

    springboot之swagger快速启动 简介 介绍 可能大家都有用过swagger,可以通过ui页面显示接口信息,快速和前端进行联调. 没有接触的小伙伴可以参考官网文章进行了解下demo页面. ...

  6. CF989B A Tide of Riverscape 思维 第七题

    A Tide of Riverscape time limit per test 1 second memory limit per test 256 megabytes input standard ...

  7. 关于Math常用的方法

    1. 常用的Math用法 Math.random() //0-1 的随机数 Math.round() //四舍五入取整 Math.ceil() //向上取整 Math.floor() //向下取整 M ...

  8. Caused by: com.fasterxml.jackson.databind.exc.InvalidDefinitionException: No serializer found for class org.apache.catalina.connector.CoyoteWriter and no properties discovered to create BeanSerializer

    一.什么是序列化In computer science, in the context of data storage, serialization is the process of transla ...

  9. 04 python之函数详解

    一.函数初识 函数的产生:函数就是封装一个功能的代码片段. li = ['spring', 'summer', 'autumn', 'winter'] def function(): count = ...

  10. c++调试在容器释放内存时报Unknown Signal 或 Trace/breakpoint trap异常

    在做一道题时,用到的板子中出现了很多的容器的使用,,一开始都是开MAXN大小的容器,,但是有几率出现程序运行完后不正常退出,, 在多次尝试断点调试后,发现主要的异常是程序在结束时,要进行资源的释放,, ...