博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Picasso源码阅读笔记六
阅读量:6202 次
发布时间:2019-06-21

本文共 3135 字,大约阅读时间需要 10 分钟。

RequestHandler是Picasso获取图片逻辑的实现类。

RequestHandler.Result

Result类是图片请求Request的处理结果。

public static final class Result {    private final Picasso.LoadedFrom loadedFrom;//图片的来源:内存、磁盘、网络    private final Bitmap bitmap;//图片数据,和InputStream只能二者选一    private final InputStream stream;//图片数据,和Bitmap只能二者选一  ...}复制代码

自定义RequestHandler

Picasso框架提供了7个RequestHandler和一个BitmapHunter.ERRORING_HANDLER,已经能够很好地满足我们的需求。同时,Picasso也允许我们根据实际需求自定义RequestHandler。 自定义RequestHandler只需要继承RequestHandler并实现两个抽象方法,然后通过Picasso.Builder的addRequestHandler方法添加到Picasso中。

public abstract class RequestHandler {    ...    public abstract boolean canHandleRequest(Request data);//判断是否能够处理图片请求    @Nullable public abstract Result load(Request request, int networkPolicy) throws IOException;//根据图片请求和网络策略获取图片,并返回处理结果Result    ...}复制代码

RequestHandler还提供了静态方法createBitmapOptions、requiresInSampleSize、calculateInSampleSize方便对图片进行压缩。

RequestHandler责任链

Picasso把默认和自定义的RequestHandler添加到属性requestHandlers中。添加顺序如下:

//extraRequestHandlers是自定义RequestHandler列表。int extraCount = (extraRequestHandlers != null ? extraRequestHandlers.size() : 0);List
allRequestHandlers = new ArrayList
(builtInHandlers + extraCount);allRequestHandlers.add(new ResourceRequestHandler(context));if (extraRequestHandlers != null) { allRequestHandlers.addAll(extraRequestHandlers);}allRequestHandlers.add(new ContactsPhotoRequestHandler(context));allRequestHandlers.add(new MediaStoreRequestHandler(context));allRequestHandlers.add(new ContentStreamRequestHandler(context));allRequestHandlers.add(new AssetRequestHandler(context));allRequestHandlers.add(new FileRequestHandler(context));allRequestHandlers.add(new NetworkRequestHandler(dispatcher.downloader, stats));requestHandlers = Collections.unmodifiableList(allRequestHandlers);复制代码

这些RequestHandler是以责任链模式被调用的,请看BitmapHunter的forRequest方法。

static BitmapHunter forRequest(Picasso picasso, Dispatcher dispatcher, Cache cache, Stats stats,    Action action) {    Request request = action.getRequest();    List
requestHandlers = picasso.getRequestHandlers(); for (int i = 0, count = requestHandlers.size(); i < count; i++) { RequestHandler requestHandler = requestHandlers.get(i); if (requestHandler.canHandleRequest(request)) {
//从前向后迭代直到找到能处理该Request的RequestHandler。 return new BitmapHunter(picasso, dispatcher, cache, stats, action, requestHandler); } } //如果没能找到合适的RequestHandler,则交给ERRORING_HANDLER,该Handler的处理方式是直接抛出异常。 return new BitmapHunter(picasso, dispatcher, cache, stats, action, ERRORING_HANDLER);}复制代码

NetworkRequestHandler

NetworkRequestHandler处理网络图片请求,图片下载逻辑是由Downloader实现的。

class NetworkRequestHandler extends RequestHandler {  static final int RETRY_COUNT = 2; //处理http或者https请求 @Override public boolean canHandleRequest(Request data) {    String scheme = data.uri.getScheme();    return (SCHEME_HTTP.equals(scheme) || SCHEME_HTTPS.equals(scheme));  }  //下载失败会重试2次  @Override int getRetryCount() {    return RETRY_COUNT;  }  //支持失败重试  @Override boolean supportsReplay() {    return true;  }}复制代码

转载于:https://juejin.im/post/5a7ef9006fb9a06348535819

你可能感兴趣的文章
python time模块
查看>>
linux 权限设置
查看>>
Hadoop的HA(安装以及遇到的问题)
查看>>
python learning----顺序查找和二分法
查看>>
luov之linux基础必会-vi命令详解
查看>>
我的LINUX学习之路之九之单用户模式下改root密码及桌面环境安装
查看>>
我的友情链接
查看>>
我的友情链接
查看>>
ELKStack
查看>>
61 Linux系统调优基础
查看>>
apache 缓存模块expires设置
查看>>
zabbix添加主机并配置图表绘制功能
查看>>
Python自定义函数、模块
查看>>
微软宣布.NET开源!支持Mac OS X和Linux
查看>>
nagios自动安装脚本
查看>>
CloudFoundry 快速上手笔记
查看>>
Using Eclipse With CloudStack
查看>>
启用logcat日志
查看>>
我的友情链接
查看>>
数据的存储介质-磁盘的硬件特性
查看>>