【Android图片加载框架】制作自己的图片加载框架
2015-12-17 20:55
501 查看
好久没写博客了,接着上一篇的内容。
下面将一些网络图片路径放入线程池操作
而任务中做如下操作:
紧接着我们将获得的图片按照相应的顺序放入一个缓存中
当然这样的设计非常有局限性,这样完全按事先排列的顺序加载是非常不好的设计方案。而在队列中的任务应当可以随时被撤销,那么这会是在什么场景下发生呢?
如:快速滑动屏幕,当前任务还未加载完就被滑过,那么就必须释放当前的任务,所以取任务也无需等待队列前的任务取完后再取,所以延生开来就是:1.先进先出。2.先进后出。
这两种方式根据情况结合运用。
private synchronized void addTask(Runnable runnable)
{
try
{
// 请求信号量,防止mPoolThreadHander为null
if (mPoolThreadHander == null)
mSemaphore.acquire();
} catch (InterruptedException e)
{
}
mTasks.add(runnable);
mPoolThreadHander.sendEmptyMessage(0x110);
}
private synchronized Runnable getTask()
{
if (mType == Type.FIFO)
{
return mTasks.removeFirst();
} else if (mType == Type.LIFO)
{
return mTasks.removeLast();
}
return null;
}
Bitmap bitmap=null;
try{
URL url = new URL(pathName);
HttpURLConnection conn = (HttpURLConnection)url.openConnection();
conn.setConnectTimeout(5000);
conn.setRequestMethod(“GET”);
if(conn.getResponseCode() == 200) {
InputStream inputStream = conn.getInputStream();
bitmap = BitmapFactory.decodeStream(inputStream);
return bitmap;
}
}catch (Exception e){
e.printStackTrace();
}
return bitmap;
“`
从网络路径中获得图片
最后在对LruCache做写入数据和获取数据的操作,当然我们也可以在整个框架中加一个对图片的压缩,这样也可以在一定程度上加快图片的显示
以最近空闲时间做的小APP(爱芝士)为例获取网络图片,效果截图如下:
下面将一些网络图片路径放入线程池操作
/** * 线程池 */ private void test_pool(){ ImageTaskManager imageTaskManager=ImageTaskManager.getInstance(); ImageTaskManagerThread imageTaskManagerThread=new ImageTaskManagerThread(); new Thread(imageTaskManagerThread).start(); String []items={"http://avatar.csdn.net/F/5/3/1_u011669081.jpg" ,"http://avatar.csdn.net/6/B/E/1_hosterzhu.jpg", "http://avatar.csdn.net/0/E/D/2_u012852396.jpg", "http://avatar.csdn.net/6/B/E/1_hosterzhu.jpg", "http://avatar.csdn.net/2/7/0/2_kun_s.jpg", "http://avatar.csdn.net/1/4/4/1_sbsujjbcy.jpg"}; for(int i=0;i<items.length;i++){ imageTaskManager.addImageTask(new ImageTask(items[i]));//添加任务进线程池 try{ Thread.sleep(1000); }catch (Exception e){ e.printStackTrace(); } } }
而任务中做如下操作:
@Override public void run() { try { URL url = new URL(name); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); conn.setConnectTimeout(5000); conn.setRequestMethod("GET"); if (conn.getResponseCode() == 200) { InputStream inputStream = conn.getInputStream(); Bitmap bitmap = BitmapFactory.decodeStream(inputStream); Log.v(TAG, name + " 完成加载"); } }catch(Exception e){ e.printStackTrace(); } }
紧接着我们将获得的图片按照相应的顺序放入一个缓存中
当然这样的设计非常有局限性,这样完全按事先排列的顺序加载是非常不好的设计方案。而在队列中的任务应当可以随时被撤销,那么这会是在什么场景下发生呢?
如:快速滑动屏幕,当前任务还未加载完就被滑过,那么就必须释放当前的任务,所以取任务也无需等待队列前的任务取完后再取,所以延生开来就是:1.先进先出。2.先进后出。
这两种方式根据情况结合运用。
public enum Type { FIFO, LIFO } `` 先进先出,和后进先出
private synchronized void addTask(Runnable runnable)
{
try
{
// 请求信号量,防止mPoolThreadHander为null
if (mPoolThreadHander == null)
mSemaphore.acquire();
} catch (InterruptedException e)
{
}
mTasks.add(runnable);
mPoolThreadHander.sendEmptyMessage(0x110);
}
添加图片任务
private synchronized Runnable getTask()
{
if (mType == Type.FIFO)
{
return mTasks.removeFirst();
} else if (mType == Type.LIFO)
{
return mTasks.removeLast();
}
return null;
}
从线程池中取任务执行
Bitmap bitmap=null;
try{
URL url = new URL(pathName);
HttpURLConnection conn = (HttpURLConnection)url.openConnection();
conn.setConnectTimeout(5000);
conn.setRequestMethod(“GET”);
if(conn.getResponseCode() == 200) {
InputStream inputStream = conn.getInputStream();
bitmap = BitmapFactory.decodeStream(inputStream);
return bitmap;
}
}catch (Exception e){
e.printStackTrace();
}
return bitmap;
“`
从网络路径中获得图片
最后在对LruCache做写入数据和获取数据的操作,当然我们也可以在整个框架中加一个对图片的压缩,这样也可以在一定程度上加快图片的显示
以最近空闲时间做的小APP(爱芝士)为例获取网络图片,效果截图如下:
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Manifest 用法
- [转载]Activity中ConfigChanges属性的用法
- Android之获取手机上的图片和视频缩略图thumbnails
- Android之使用Http协议实现文件上传功能
- Android学习笔记(二九):嵌入浏览器
- android string.xml文件中的整型和string型代替
- i-jetty环境搭配与编译
- android之定时器AlarmManager
- android wifi 无线调试
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- android 代码实现控件之间的间距
- android FragmentPagerAdapter的“标准”配置
- Android"解决"onTouch和onClick的冲突问题
- android:installLocation简析
- android searchView的关闭事件
- SourceProvider.getJniDirectories