图片选择功能在平时开发中十分常用,以前才混开发的时候总是用系统自动的调用图片的方式。不得不说那样很low,是时候和过去说拜拜了。
看了hongyang大牛关于图片选择器的博客和视频N遍,终于学会了如何写一个图片加载器。这里就一步步再次还原,留作纪念吧。如果以后有机会,我会完善这个,并添加一些新的生命力。
话不多说
一、新建图片加载的工具类 (你也可以使用图片加载的框架跳过这部分)
1.初始化成员变量,并且使用单例
package com.warden.common;
import android.graphics.Bitmap;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.support.v4.util.LruCache;
import java.util.LinkedList;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
/**
* Created by warden on 16/3/28.
*/
public class PictureLoder
{
/**
* 实例
*/
private static PictureLoder mInstance;
/**
* 图片缓存
*/
private LruCache<String, Bitmap> mLruCache;
/**
* 线程数量
*/
private int mThreadCount;
/**
* last in fist out(后进先出)
* <p/>
* last in last out(后进后出)
*/
public enum PictureType
{
LIFO, LILO
}
/**
* 调度方式
*/
private PictureType mType;
/**
* 线程池
*/
private ExecutorService mTheadPool;
/**
* 任务队列,加载图片的任务体
*/
private LinkedList<Runnable> mTaskQueue;
/**
* 一个默默工作的 轮训工人
*/
private Thread mWorkerThread;
/**
* UI线程 的 Hanlder
*/
private Handler mUiHandler;
/**
* 用于轮训的异步机制
*/
private Handler mWorkerHandler;
/**
* 私有化 构造器
*/
private PictureLoder(int threadCount, PictureType type)
{
mThreadCount = threadCount;
mType = type;
//将运行内存的8分之1作为缓存的大小
int cacheSize = (int) (Runtime.getRuntime().maxMemory() / 8);
//初始化缓存
mLruCache = new LruCache<String, Bitmap>(cacheSize)
{
@Override
protected int sizeOf(String key, Bitmap value)
{
//测量每一个Bitmap的大小
//高度 * 每一行的字节数
return value.getHeight() * value.getRowBytes();
}
};
//后台轮训线程
mWorkerThread = new Thread()
{
@Override
public void run()
{
//准备
Looper.prepare();
mWorkerHandler = new Handler()
{
@Override
public void handleMessage(Message msg)
{
//TODO 异步的消息处理
//TODO 线程同步
}
};
//死循环吧...
Looper.loop();
}
};
//轮训吧- -
mWorkerThread.start();
//队列初始化
mTaskQueue=new LinkedList<Runnable>();
//初始化线程池,虽然这货还不是很熟。先用着吧.
mTheadPool= Executors.newFixedThreadPool(mThreadCount);
}
}