后台轮询线程(Thread)不断访问任务队列(LinkList<Runnable>),如果任务队列中有加载图片的任务(Runnable),就通过Handler发消息给线程池(ExecuterService),让线程池拿出一个子线程,然后根据调度任务的策略(LIFO)从任务队列中取出一个任务去完成图片的获取,因为图片是异步的在子线程中获取到的,不能直接显示,所以需要通过一个UI相关的Handler把图片对象发送到UI线程中,最后完成图片的显示。把这个逻辑搞清楚了,回头再看看,需要设计哪些变量,一目了然。
2016-03-26
这是用Thread、Handler、Message自己实现图片加载功能,且包含了内存缓存和图片压缩,实际上也就是实现了一个图片加载库,帮助我们搞清楚原理,在不清楚原理的情况下可以用第三方库直接在GridView显示本地图片,但要注意不要使用磁盘缓存...
2016-03-23
其实用HandlerThread实现和用Thread+Handler机制是一样的。用HandlerThread,其实也是创建了Thread,Thread里创建了Looper对象,然后将线程的Looper对象传递给Handler,自然handler的消息处理是在子线程中执行了。
学习要知其然,更要知其所以然。
学习要知其然,更要知其所以然。
2016-03-11
这里我说一下UI线程中Handler的创建和子线程中Handler的创建。其实,这个Util里,初始化UI Handler的时候,应该如下:
mUIHandler = new Handler(Looper.getMainLooper());
是为了防止这个类在子线程中调用,导致UI Handler失效。
看过Handler、Looper、Message源码的同学应该知道,Handler默认构造函数中,会获取当前所在线程的Looper作为自己的Looper对象。所以,Handler在UI线程中初始化,获取的是UI的Looper,在子线程中初始化,获取的是子线程的Looper。
mUIHandler = new Handler(Looper.getMainLooper());
是为了防止这个类在子线程中调用,导致UI Handler失效。
看过Handler、Looper、Message源码的同学应该知道,Handler默认构造函数中,会获取当前所在线程的Looper作为自己的Looper对象。所以,Handler在UI线程中初始化,获取的是UI的Looper,在子线程中初始化,获取的是子线程的Looper。
2016-03-11