picasso-高级使用配置线程池

2024-05-29 00:38

本文主要是介绍picasso-高级使用配置线程池,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

2.自定义线程池
通过上一片博客我们了解了picasso通过Build模式构建构建的代码如下

 if (service == null) {service = new PicassoExecutorService();}

想了解picasso设置缓存位置以及源码如何构建picasso的可以参考下面的博客
picasso源码构建分析及下载位置设置
那首先我们看picasso默认的线程池是什么样子的源码如下

class PicassoExecutorService extends ThreadPoolExecutor {private static final int DEFAULT_THREAD_COUNT = 3;PicassoExecutorService() {super(DEFAULT_THREAD_COUNT, DEFAULT_THREAD_COUNT, 0, TimeUnit.MILLISECONDS,new PriorityBlockingQueue<Runnable>(), new Utils.PicassoThreadFactory());}void adjustThreadCount(NetworkInfo info) {if (info == null || !info.isConnectedOrConnecting()) {setThreadCount(DEFAULT_THREAD_COUNT);return;}switch (info.getType()) {case ConnectivityManager.TYPE_WIFI:  //wificase ConnectivityManager.TYPE_WIMAX:case ConnectivityManager.TYPE_ETHERNET:setThreadCount(4);break;case ConnectivityManager.TYPE_MOBILE:switch (info.getSubtype()) {case TelephonyManager.NETWORK_TYPE_LTE:  // 4Gcase TelephonyManager.NETWORK_TYPE_HSPAP:case TelephonyManager.NETWORK_TYPE_EHRPD:setThreadCount(3);break;case TelephonyManager.NETWORK_TYPE_UMTS: // 3Gcase TelephonyManager.NETWORK_TYPE_CDMA:case TelephonyManager.NETWORK_TYPE_EVDO_0:case TelephonyManager.NETWORK_TYPE_EVDO_A:case TelephonyManager.NETWORK_TYPE_EVDO_B:setThreadCount(2);break;case TelephonyManager.NETWORK_TYPE_GPRS: // 2Gcase TelephonyManager.NETWORK_TYPE_EDGE:setThreadCount(1);break;default:setThreadCount(DEFAULT_THREAD_COUNT);}break;default:setThreadCount(DEFAULT_THREAD_COUNT);}}private void setThreadCount(int threadCount) {setCorePoolSize(threadCount);setMaximumPoolSize(threadCount);}@Overridepublic Future<?> submit(Runnable task) {PicassoFutureTask ftask = new PicassoFutureTask((BitmapHunter) task);execute(ftask);return ftask;}private static final class PicassoFutureTask extends FutureTask<BitmapHunter>implements Comparable<PicassoFutureTask> {private final BitmapHunter hunter;public PicassoFutureTask(BitmapHunter hunter) {super(hunter, null);this.hunter = hunter;}@Overridepublic int compareTo(PicassoFutureTask other) {Picasso.Priority p1 = hunter.getPriority();Picasso.Priority p2 = other.hunter.getPriority();// High-priority requests are "lesser" so they are sorted to the front.// Equal priorities are sorted by sequence number to provide FIFO ordering.return (p1 == p2 ? hunter.sequence - other.hunter.sequence : p2.ordinal() - p1.ordinal());}}
}

构造方法我们就不再做过多的分析很简单的一个调用super的方法
下面我们分析picasso强大线程池的第一个方法 adjustThreadCount(NetworkInfo info)第一个判断

if (info == null || !info.isConnectedOrConnecting()) {setThreadCount(DEFAULT_THREAD_COUNT);return;}private void setThreadCount(int threadCount) {setCorePoolSize(threadCount);setMaximumPoolSize(threadCount);}

意思是如果网络没连接的情况下picasso会默认给我们设置核心线程数跟最大线程数为默认的3。知道了这个我们下面的swich方法处理也就一目了然了 wifi情况下给我们创建了一个核心数为4的线程池,4G 3的线程池,3G 2的线程池,2G 1的线程池,由此可见picasso的线程池是根据我们的网络状态控制的。

接下来我们来看picasso的下一个方法submit(Runnable task)关键代码如下

 PicassoFutureTask ftask = new PicassoFutureTask((BitmapHunter) task);execute(ftask);

我们看到如果一个线程池执行任务是直接调用 execute(task);该方法在picasso中picasso是将runnable转换成了自己的PicassoFutureTask 来执行好我们继续看PicassoFutureTask 是如何处理我们的线程池的那就是我们PicassoExecutorService 最下面的一个内部类了对于FutureTask 的认识看如下介绍:
一个FutureTask 可以用来包装一个 Callable 或是一个runnable对象。因为FurtureTask实现了Runnable方法,所以一个 FutureTask可以提交(submit)给一个Excutor执行(excution)。
也就是说我们的FurtureTask是一个特殊的Runnable他可以判断我们的runnable是不是执行完了也可以终止我们的线程,再看我们的BitmapHunter

class BitmapHunter implements Runnable{......
}

里面的代码太多了我在这里就先不做过多介绍了从继承关系上看他是一个实现了Runnable接口的类。
compareTo(PicassoFutureTask other) 是给任务排序的方法。
最终我们总结出我们的PicassoFutureTask是一个继承特殊runnable 可以随时终止任务的,实现Comparable的内部类它的功能是
1.控制runnable的执行
2.对比Priority的优先级给runnable排序

哈哈写到这里感觉是在分析源码了好吧接下来讲解如何给picasso设置线程池代码如下

   ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(CPU_COUNT + 1, CPU_COUNT * 2 + 1,1, TimeUnit.MINUTES, new PriorityBlockingQueue<Runnable>());Picasso picasso = new Picasso.Builder(this).executor(threadPoolExecutor).build();Picasso.setSingletonInstance(picasso);//这句话很重要别忘了加上啊picasso.load("http://i2.17173cdn.com/i7mz64/YWxqaGBf/tu17173com/20151019/phiDLtbkbFqzitl.jpg").into(iv);

这样的话我们的picasso的线程池就配置完了接下来我们还有更精彩的章节就留在下一篇博客中去说明吧。

这篇关于picasso-高级使用配置线程池的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1012147

相关文章

C++ Sort函数使用场景分析

《C++Sort函数使用场景分析》sort函数是algorithm库下的一个函数,sort函数是不稳定的,即大小相同的元素在排序后相对顺序可能发生改变,如果某些场景需要保持相同元素间的相对顺序,可使... 目录C++ Sort函数详解一、sort函数调用的两种方式二、sort函数使用场景三、sort函数排序

Java String字符串的常用使用方法

《JavaString字符串的常用使用方法》String是JDK提供的一个类,是引用类型,并不是基本的数据类型,String用于字符串操作,在之前学习c语言的时候,对于一些字符串,会初始化字符数组表... 目录一、什么是String二、如何定义一个String1. 用双引号定义2. 通过构造函数定义三、St

浅谈配置MMCV环境,解决报错,版本不匹配问题

《浅谈配置MMCV环境,解决报错,版本不匹配问题》:本文主要介绍浅谈配置MMCV环境,解决报错,版本不匹配问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录配置MMCV环境,解决报错,版本不匹配错误示例正确示例总结配置MMCV环境,解决报错,版本不匹配在col

Pydantic中Optional 和Union类型的使用

《Pydantic中Optional和Union类型的使用》本文主要介绍了Pydantic中Optional和Union类型的使用,这两者在处理可选字段和多类型字段时尤为重要,文中通过示例代码介绍的... 目录简介Optional 类型Union 类型Optional 和 Union 的组合总结简介Pyd

Nginx中配置HTTP/2协议的详细指南

《Nginx中配置HTTP/2协议的详细指南》HTTP/2是HTTP协议的下一代版本,旨在提高性能、减少延迟并优化现代网络环境中的通信效率,本文将为大家介绍Nginx配置HTTP/2协议想详细步骤,需... 目录一、HTTP/2 协议概述1.HTTP/22. HTTP/2 的核心特性3. HTTP/2 的优

Vue3使用router,params传参为空问题

《Vue3使用router,params传参为空问题》:本文主要介绍Vue3使用router,params传参为空问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录vue3使用China编程router,params传参为空1.使用query方式传参2.使用 Histo

Python 安装和配置flask, flask_cors的图文教程

《Python安装和配置flask,flask_cors的图文教程》:本文主要介绍Python安装和配置flask,flask_cors的图文教程,本文通过图文并茂的形式给大家介绍的非常详细,... 目录一.python安装:二,配置环境变量,三:检查Python安装和环境变量,四:安装flask和flas

使用Python自建轻量级的HTTP调试工具

《使用Python自建轻量级的HTTP调试工具》这篇文章主要为大家详细介绍了如何使用Python自建一个轻量级的HTTP调试工具,文中的示例代码讲解详细,感兴趣的小伙伴可以参考一下... 目录一、为什么需要自建工具二、核心功能设计三、技术选型四、分步实现五、进阶优化技巧六、使用示例七、性能对比八、扩展方向建

使用Python实现一键隐藏屏幕并锁定输入

《使用Python实现一键隐藏屏幕并锁定输入》本文主要介绍了使用Python编写一个一键隐藏屏幕并锁定输入的黑科技程序,能够在指定热键触发后立即遮挡屏幕,并禁止一切键盘鼠标输入,这样就再也不用担心自己... 目录1. 概述2. 功能亮点3.代码实现4.使用方法5. 展示效果6. 代码优化与拓展7. 总结1.

使用Python开发一个简单的本地图片服务器

《使用Python开发一个简单的本地图片服务器》本文介绍了如何结合wxPython构建的图形用户界面GUI和Python内建的Web服务器功能,在本地网络中搭建一个私人的,即开即用的网页相册,文中的示... 目录项目目标核心技术栈代码深度解析完整代码工作流程主要功能与优势潜在改进与思考运行结果总结你是否曾经