首先我们看下作者的思路:
创建缓存目录 ->; 通过一个线程进行获取xml文件内容 ->; 对获取的xml文件进行解析获取所有的图片id、图片名称、图片地址 -> 在线程中通过Handler的Message创建listview的adapter -> 在adapter中实现异步加载图片资源.
//下一篇将分析:[异步加载专题][原创分析]中级篇本地缓存、ListView滑动停止加载、利用synchronized控制线程数机制、很好的文件结构
下面我们开始分析MainActivity:
1 | package com.example.synctask; |
其中Contact用于存储从xml中读取到的对象类型:
1 | package com.example.synctask; |
ContactService 用于获取网络资源:
1 | package com.example.synctask; |
其中MainActivity中的线程:
1 | //获取数据,主UI线程是不能做耗时操作的,所以启动子线程来做 |
先通过
1 | contacts = service.getContactAll(); |
获得解析后的所有的Contact.
通过Hanlder的Message
1 | Message msg = new Message(); |
发送到
1 | private Handler mHandler = new Handler(){ |
在handleMessage中创建ListView的Adapter.
在ImageAdapter中:
1 |
|
调用asyncloadImage顾名思义异步加载图片:
1 | private void asyncloadImage(ImageView iv_header, String path) { |
在其中创建联网下载图片的对象service传入以AsyncTask 为父类(暂且理解为可以更新UI的线程)的task对象.
1 | private final class AsyncImageTask extends AsyncTask<string, Integer, Uri> { |
我们可以清晰的看到:
此类在:protected void onPostExecute(Uri result)是需要传入一个Uri类型的值得。
而protected Uri doInBackground(String… params)的返回值恰好是Uri(通过后面我们可以清晰的了解到,这个值就是传递给onPostExecute的)。
而这个线程的请求应该是通过:task.execute(path);
我们看下protected Uri doInBackground(String… params)
1 | // 后台运行的子线程子线程 |
这个在后台运行的子线程子线程调通过getImageURI返回获取Uri.
我们看下:getImageURI
:
1 | /* |
这里已经备注的很清晰了,需要提到的是这里通过MD5来加密了获取到的图片的名字.
就是项目中涉及到的:
1 | package com.example.synctask; |
此时更新ui
1 | // 这个放在在ui线程中执行 |
至此简单的异步加载就实现了。