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

android异步加载图片

2015-12-08 13:26 465 查看
这是一个可以实现异步加载网络图片、并把图片保存在本地文件当中。

加载图片的时候,先在内存中寻找、如果没有在文件中寻找、如果还是没有再从网络中加载图片。

调用方法如下:



<pre name="code" class="java">AsynImageLoader mLoader = new AsyncImageLoader();
//参数一为控件id 参数二控件2为图片的URL 参数三为图片加载成功后调用的函数
mLoader.loadBitmap(ImageView img,String url,ImageCallBack imageCallBack);



具体实现类


import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Handler;
import android.os.Message;
import android.widget.ImageView;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.lang.ref.SoftReference;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.HashMap;

public class AsynImageLoader {
private static final String FILENAME = "/mnt/sdcard/lxgame/imageload/";
/**
* 内存图片软引用缓冲
*/
private HashMap<String, SoftReference<Bitmap>> imageCache = null;
public AsynImageLoader() {
imageCache = new HashMap<>();
}

public Bitmap loadBitmap(final ImageView imageView, final String imageURL, final ImageCallBack imageCallBack) {
//在内存缓存中,则返回Bitmap对象
final Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
imageCallBack.imageLoad(imageView, (Bitmap)msg.obj);
}
};
if(imageCache.containsKey(imageURL)) {
SoftReference<Bitmap> reference = imageCache.get(imageURL);
Bitmap bitmap = reference.get();
if(bitmap != null) {
return bitmap;
}
} else {   //本地缓存
String bitmapName = imageURL.substring(imageURL.lastIndexOf("/") + 1);
File cacheDir = new File(FILENAME);
File[] cacheFiles = cacheDir.listFiles();
int i = 0;
if(null!=cacheFiles){
for(; i<cacheFiles.length; i++)
{
if(bitmapName.equals(cacheFiles[i].getName()))
{
break;
}
}

if(i < cacheFiles.length) {
Bitmap bitmap = BitmapFactory.decodeFile(FILENAME + bitmapName);
Message msg = handler.obtainMessage(0,bitmap);
handler.sendMessage(msg);
return bitmap;
}
}
}
//如果不在内存缓存中,也不在本地,则开启线程下载图片
new Thread() {
@Override
public void run() {
InputStream bitmapIs = getStreamFromURL(imageURL);
Bitmap bitmap = BitmapFactory.decodeStream(bitmapIs);
imageCache.put(imageURL, new SoftReference<>(bitmap));
Message msg = handler.obtainMessage(0, bitmap);
handler.sendMessage(msg);
File dir = new File(FILENAME);
if(!dir.exists()) dir.mkdirs();
File bitmapFile = new File(FILENAME +
imageURL.substring(imageURL.lastIndexOf("/") + 1));
if(!bitmapFile.exists()) {
try {
bitmapFile.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
}
FileOutputStream fos;
try {
fos = new FileOutputStream(bitmapFile);
bitmap.compress(Bitmap.CompressFormat.PNG,
100, fos);
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}.start();
return null;
}

private InputStream getStreamFromURL(String imageURL) {
InputStream in=null;
try {
URL url=new URL(imageURL);
HttpURLConnection connection=(HttpURLConnection) url.openConnection();
in=connection.getInputStream();
} catch (Exception e) {
e.printStackTrace();
}
return in;

}
public interface ImageCallBack {
void imageLoad(ImageView imageView, Bitmap bitmap);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: