您的位置:首页 > 移动开发 > Android开发

【Android图片加载框架】制作自己的图片加载框架

2015-12-17 20:55 501 查看
好久没写博客了,接着上一篇的内容。

下面将一些网络图片路径放入线程池操作

/**
* 线程池
*/
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(爱芝士)为例获取网络图片,效果截图如下:



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android 图片 线程池