ExecutorService 异步线程下载
/**
* 下载Image的线程池
*/
private ExecutorService mImageThreadPool = null;
/**
* 获取线程池的方法
* @return
*/
public ExecutorService getThreadPool()
{
synchronized (ExecutorService.class) //同步的
{
if (null == mImageThreadPool)
{
//用2个线程来下载图片
mImageThreadPool = Executors.newFixedThreadPool(2);
}
}
return mImageThreadPool;
}
/**
* 先从内存缓存中获取Bitmap,如果没有就从SD卡或者手机缓存中获取,SD卡或者手机缓存
* 没有就去下载
* @param url
* @param listener
* @return
*/
@SuppressLint("HandlerLeak")
public void downloadImage(final String url, final onImageLoaderListener listener)
{
final Handler handler = new Handler()
{
@Override
public void handleMessage(Message msg)
{
super.handleMessage(msg);
listener.onImageLoader((Bitmap) msg.obj, url);
}
};
//我们没有创建此目录保存文件就会保存
final String subUrl = url.replaceAll("[^\\w]", "");
getThreadPool().execute(new Runnable()
{
@Override
public void run()
{
Bitmap bitmap = getHttpBitmap(url);
Message msg = handler.obtainMessage();
msg.obj = bitmap;
handler.sendMessage(msg);
//将Bitmap 加入内存缓存
addBitmapToMemoryCache(subUrl, bitmap);
}
});
}
/**
* 取消正在下载的任务
*/
public synchronized void cancelTask()
{
if (mImageThreadPool != null)
{
mImageThreadPool.shutdownNow();
mImageThreadPool = null;
}
}
/**
* 异步下载图片的回调接口
*/
public interface onImageLoaderListener
{
void onImageLoader(Bitmap bitmap, String url);
}
/**
* 获取网落图片资源
* @param url
* @return
*/
private Bitmap getHttpBitmap(String url)
{
Bitmap bitmap = null;
try
{
URL myFileURL = new URL(url);
HttpURLConnection conn = (HttpURLConnection) myFileURL.openConnection();
conn.setConnectTimeout(6000);
conn.setDoInput(true);
conn.setUseCaches(false);
InputStream is = conn.getInputStream();
bitmap = BitmapFactory.decodeStream(is);
is.close();
} catch (Exception e)
{
e.printStackTrace();
}
return bitmap;
}