这是一个慕课网关于AsynTask的教程代码。
慕课网连接
项目源码
https://pan.baidu.com/s/1b9FLAe
密码k6xh
工具类ImageLoad.java
/**
* Created by yipai on 16/11/30.
*/
public class ImageLoad {
/**
* 实现异步加载一共有两种方式,一种是多线程方式第二种就是通过AsynTask
*/
private ImageView mImageView;
private String mUrl;
//创建缓存
private LruCache<String, Bitmap> mCache;
private ListView mListView;
private Set<ImageAsyncTack> mTask;
public ImageLoad(ListView listView) {
mListView = listView;
mTask = new HashSet<>();
//获取最大可用内存
int maxMenmory = (int) Runtime.getRuntime().maxMemory();
Log.e("tag", "可用缓存大小为 " + (maxMenmory / 1048576) + "MB");
//设置缓存大小
int cacheSize = maxMenmory / 2;
//初始化缓存
mCache = new LruCache<String, Bitmap>(cacheSize) {
@Override
protected int sizeOf(String key, Bitmap value) {
//在每次存入缓存是调用
return value.getByteCount();//返回图片大小
}
};
}
/**
* 用来加载充start到end位置的图片
*
* @param start
* @param end
*/
public void loadImage(int start, int end) {
for (int i = start; i < end; i++) {
//取出开始到结束的图片对应的url地址
String url = MyAdapter.mAllUrl[i];
Bitmap bitmap = getBitmapFromCache(url);
//如果缓存中没有对应的图片,那么必须去直接下载
if (bitmap == null) {
Log.e("tag", "缓存中没有对应的图片");
ImageAsyncTack imageAsyncTack = new ImageAsyncTack(url);
imageAsyncTack.execute(url);
mTask.add(imageAsyncTack);
} else {
//如果缓存中有,那么直接从缓存中加载图片
Log.e("tag", "直接从缓存中加载图片");
ImageView imageView = (ImageView) mListView.findViewWithTag(url);
imageView.setImageBitmap(bitmap);
}
}
}
/**
* 增加缓存
*
* @param url
* @param bitmap
*/
public void addBitmapToCache(String url, Bitmap bitmap) {
//判断当前缓存是否存在,如果不存在那么进行缓存
if (getBitmapFromCache(url) == null) {
Log.e("tag", "缓存下载的图片");
mCache.put(url, bitmap);
}
}
/**
* 读取缓存
*
* @param url
* @return
*/
public Bitmap getBitmapFromCache(String url) {
return mCache.get(url);
}
private Handler mHandle = new Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
if (mImageView.getTag().equals(mUrl)) {
mImageView.setImageBitmap((Bitmap) msg.obj);
}
}
};
//使用多线程实现异步加载
public void showImageByThread(ImageView imageView, final String url) {
//将传递过来的数据保存起来
mImageView = imageView;
mUrl = url;
new Thread() {
@Override
public void run() {
super.run();
Bitmap bitmap = getBitmapForUrl(url);
Message msg = Message.obtain();//可以使用现有的Message提高message使用效率
msg.obj = bitmap;
mHandle.sendMessage(msg);
}
}.start();
}
/**
* 通过url获取Bitmap对象
*
* @param url
* @return
*/
public Bitmap getBitmapForUrl(String url) {
Bitmap bitmap;
InputStream inputStream = null;
try {
URL mUrl = new URL(url);
HttpURLConnection httpURLConnection = (HttpURLConnection) mUrl.openConnection();
inputStream = new BufferedInputStream(httpURLConnection.getInputStream());
bitmap = BitmapFactory.decodeStream(inputStream);
httpURLConnection.disconnect();
return bitmap;
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
assert inputStream != null;
inputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return null;//默认情况下
}
public void showImageViewByAsynTask(ImageView imageView, final String url) {
Bitmap bitmap = getBitmapFromCache(url);
//如果缓存中没有对应的图片,那么必须去直接下载
if (bitmap == null) {
Log.e("tag", "缓存中没有对应的图片");
imageView.setImageResource(R.mipmap.ic_launcher);
} else {
//如果缓存中有,那么直接从缓存中加载图片
Log.e("tag", "直接从缓存中加载图片");
imageView.setImageBitmap(bitmap);
}
}
public void canceAllTask() {
if (mTask != null) {
//foreach循环取出mTask集合中所有任务
for (ImageAsyncTack task : mTask) {
//取消任务
task.cancel(false);
}
}
}
private class ImageAsyncTack extends AsyncTask<String, Void, Bitmap> {
private String mUrl;
public ImageAsyncTack(String mUrl) {
this.mUrl = mUrl;
}
@Override
protected Bitmap doInBackground(String... strings) {
String url = strings[0];
//从网络获取图片,如果图片存在,那么把图片下载后传入缓存中
Bitmap bitmap = getBitmapForUrl(url);
if (bitmap != null) {
Log.e("tag", "把图片加入到缓存中去");
addBitmapToCache(url, bitmap);
}
return bitmap;
}
@Override
protected void onPostExecute(Bitmap bitmap) {
super.onPostExecute(bitmap);
ImageView imageView = (ImageView) mListView.findViewWithTag(mUrl);
if (imageView != null && bitmap != null) {
imageView.setImageBitmap(bitmap);
}
//从集合中移除以加载完成的事务
mTask.remove(this);
}
}
}