Android使用ImageLoader异步加载网络图片(一)读取单张图片
这里我写的是读取单张的图片从网络读取,和listview多张图片的读取首先是单张的读取这篇博客只写了读取单张的读取多张的下一篇写 此例子的代码 已上传资源页
由于昨天时间比较紧所以,这个Demo 的源码中好像是忘了添加权限,抱歉。希望大家下载以后自己在源码的androidManifest.xml中添加网络访问和SD读写权限
http://download.csdn.net/detail/u012373815/9002225
准备:在androidManifest.xml中添加权限
<!-- 网络权限 -->
<uses-permission android:name="android.permission.INTERNET" />
<!--sd卡权限 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" >
</uses-permission>
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" >
</uses-permission>
一. 导入所需的工具类 (四个类)
FileCache.java
import java.io.File;
importandroid.content.Context;
publicclassFileCache {
privateFilecacheDir;
publicFileCache(Context context){
//找一个用来缓存图片的路径
if (android.os.Environment.getExternalStorageState().equals(android.os.Environment.MEDIA_MOUNTED))
cacheDir=new File(android.os.Environment.getExternalStorageDirectory(),"LazyList");
else
cacheDir=context.getCacheDir();
if(!cacheDir.exists())
cacheDir.mkdirs();
}
publicFile getFile(String url){
String filename=String.valueOf(url.hashCode());
File f = new File(cacheDir, filename);
return f;
}
publicvoidclear(){
File[] files=cacheDir.listFiles();
if(files==null)
return;
for(File f:files)
f.delete();
}
}
ImageLoader.java
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.Collections;
import java.util.Map;
import java.util.WeakHashMap;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import com.example.imageloaddemo.R;
import android.app.Activity;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.util.Log;
importandroid.widget.ImageView;
publicclassImageLoader {
MemoryCache memoryCache=newMemoryCache();
FileCache fileCache;
privateMap<ImageView, String>imageViews=Collections.synchronizedMap(new WeakHashMap<ImageView,String>());
ExecutorService executorService;
publicImageLoader(Context context){
fileCache=new FileCache(context);
executorService=Executors.newFixedThreadPool(5);
}
finalintstub_id= R.drawable.ic_launcher; //没有图片
publicvoidDisplayImage(String url, ImageView imageView)
{
imageViews.put(imageView, url);
Bitmap bitmap=memoryCache.get(url);
if(bitmap!=null)
//存在
imageView.setImageBitmap(bitmap);
else
{ //不存在
queuePhoto(url,imageView);
imageView.setImageResource(stub_id);
}
}
privatevoidqueuePhoto(String url, ImageView imageView)
{ Log.i("ImageLoader","00000000000000");
PhotoToLoad p=new PhotoToLoad(url,imageView);
executorService.submit(new PhotosLoader(p));
}
privateBitmap getBitmap(String url)
{
File f=fileCache.getFile(url);
Log.i("ImageLoader","222222222222222");
//从sd加载
Bitmap b = decodeFile(f);
if(b!=null)
return b;
//从网络加载
try {
Bitmap bitmap=null;
URL imageUrl = new URL(url);
Log.i("ImageLoader",url+"aaaaaaaaaaa");
HttpURLConnection conn =(HttpURLConnection)imageUrl.openConnection();
conn.setConnectTimeout(30000);
conn.setReadTimeout(30000);
conn.setInstanceFollowRedirects(true);
int code=conn.getResponseCode();
if(code==200)
{
Log.i("ImageLoader","33333333333333");
}
InputStreamis=conn.getInputStream();
Log.i("ImageLoader",is+"is555555555555");
OutputStream os = newFileOutputStream(f);
Log.i("ImageLoader",bitmap+"555555555555");
Utils.CopyStream(is,os);
os.close();
bitmap = decodeFile(f);
Log.i("ImageLoader",bitmap+"555555555555");
return bitmap;
} catch (Exception ex){
ex.printStackTrace();
returnnull;
}
}
//解码图像用来减少内存消�??
privateBitmap decodeFile(File f){
try {
//解码图像大小
BitmapFactory.Options o =newBitmapFactory.Options();
o.inJustDecodeBounds =true;
BitmapFactory.decodeStream(new FileInputStream(f),null,o);
//找到正确的刻度�?�,它应该是2的幂�?
finalint REQUIRED_SIZE=140; //解缩大小
int width_tmp=o.outWidth, height_tmp=o.outHeight;
int scale=1;
while(true){
if(width_tmp/2<REQUIRED_SIZE ||height_tmp/2<REQUIRED_SIZE)
break;
width_tmp/=2;
height_tmp/=2;
scale*=2;
}
BitmapFactory.Options o2 =newBitmapFactory.Options();
o2.inSampleSize=scale;
return BitmapFactory.decodeStream(new FileInputStream(f),null, o2);
} catch (FileNotFoundException e) {}
returnnull;
}
//任务队列
privateclassPhotoToLoad
{
public Stringurl;
public ImageViewimageView;
public PhotoToLoad(String u, ImageViewi){
url=u;
imageView=i;
}
}
classPhotosLoaderimplements Runnable {
PhotoToLoad photoToLoad;
PhotosLoader(PhotoToLoadphotoToLoad){
this.photoToLoad=photoToLoad;
}
@Override
publicvoid run() {
Log.i("ImageLoader","11111111");
if(imageViewReused(photoToLoad))
return;
Bitmap bmp=getBitmap(photoToLoad.url);
memoryCache.put(photoToLoad.url, bmp);
if(imageViewReused(photoToLoad))
return;
BitmapDisplayer bd=new BitmapDisplayer(bmp,photoToLoad);
Activity a=(Activity)photoToLoad.imageView.getContext();
a.runOnUiThread(bd);
}
}
booleanimageViewReused(PhotoToLoad photoToLoad){
String tag=imageViews.get(photoToLoad.imageView);
if(tag==null || !tag.equals(photoToLoad.url))
returntrue;
returnfalse;
}
//用于显示位图在UI线程
classBitmapDisplayerimplements Runnable
{
Bitmap bitmap;
PhotoToLoad photoToLoad;
public BitmapDisplayer(Bitmap b,PhotoToLoad p){bitmap=b;photoToLoad=p;}
publicvoid run()
{ Log.i("ImageLoader","2222222");
if(imageViewReused(photoToLoad))
return;
if(bitmap!=null)
photoToLoad.imageView.setImageBitmap(bitmap);
else
photoToLoad.imageView.setImageResource(stub_id);
}
}
publicvoidclearCache() {
memoryCache.clear();
fileCache.clear();
}
}
MemoryCache.Java
import java.lang.ref.SoftReference;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
importandroid.graphics.Bitmap;
// ④程序缓存的处理,主要是内存缓存+文件缓存。内存缓存中网上很多是采用SoftReference来防止堆溢出
publicclassMemoryCache {
privateMap<String,SoftReference<Bitmap>>cache=Collections.synchronizedMap(new HashMap<String, SoftReference<Bitmap>>());/
publicBitmap get(Stringid){
if(!cache.containsKey(id))
returnnull;
SoftReference<Bitmap> ref=cache.get(id);
return ref.get();
}
publicvoidput(String id,Bitmap bitmap){
cache.put(id, new SoftReference<Bitmap>(bitmap));
}
publicvoidclear() {
cache.clear();
}
}
Utils.java
import java.io.InputStream;
importjava.io.OutputStream;
//读取流的工具类,Utils.java?
publicclassUtils {
publicstaticvoidCopyStream(InputStream is, OutputStream os)
{
finalint buffer_size=1024;
try
{ Log.i("ImageLoader","4444444444444");
byte[] bytes=newbyte[buffer_size];
for(;;)
{
int count=is.read(bytes, 0, buffer_size);
if(count==-1)
break;
os.write(bytes, 0, count);
}
}
catch(Exception ex){}
}
}
二.调用
publicclassMainActivity extends Activity {
private ImageLoaderimage;
private Buttonbuttonimg;
private ImageViewimageloder;
String path;
@Override
protectedvoidonCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
imageloder=(ImageView)findViewById(R.id.imageloder);
buttonimg=(Button)findViewById(R.id.buttonimg);
buttonimg.setOnClickListener(new OnClickListener() {
@Override
publicvoid onClick(View v) {
path="http://acm.hpu.edu.cn/backtow/imagething/1428379408250.jpg";
image=newImageLoader(MainActivity.this);
image.DisplayImage(path, imageloder);
}
});
}
}
Android使用ImageLoader异步加载网络图片(一)读取单张图片相关推荐
- android Gallery实现异步加载网络图片
之前在网上找了很多都没有这方面的资料,大概的效果是当Gallery滑动时不下载图片,当Gallery滑动停止时加载当前页面图片,自己花了一点时间大概的实现了,如果各位有更好的意见欢迎说出来大家一起学习 ...
- Android之ListView异步加载网络图片(优化缓存机制)
网上关于这个方面的文章也不少,基本的思路是线程+缓存来解决.下面提出一些优化: 1.采用线程池 2.内存缓存+文件缓存 3.内存缓存中网上很多是采用SoftReference来防止堆溢出,这儿严格限制 ...
- android 图片加载 软引用_Android 异步加载网络图片并缓存到本地 软引用 学习分享(转)...
迪 王. 于 星期四, 20/02/2014 - 21:36 提交 在android应用开发的时候,加载网络图片是一个非常重要的部分,很多图片不可能放在本地,所以就必须要从服务器或者网络读取图片. 软 ...
- 浅谈Android中的异步加载之ListView中图片的缓存及优化三
隔了很久没写博客,现在必须快速脉动回来.今天我还是接着上一个多线程中的异步加载系列中的最后一个使用异步加载实现ListView中的图片缓存及其优化.具体来说这次是一个综合Demo.但是个人觉得里面还算 ...
- IOS开发之异步加载网络图片并缓存本地实现瀑布流(一)
2019独角兽企业重金招聘Python工程师标准>>> 版权声明:本文为博主原创文章,未经博主允许不得转载. [objc] view plaincopy </pre>&l ...
- iOS开发swift版异步加载网络图片(带缓存和缺省图片)
iOS开发之swift版异步加载网络图片 与SDWebImage异步加载网络图片的功能相似,只是代码比较简单,功能没有SD的完善与强大,支持缺省添加图片,支持本地缓存. 异步加载图片的核心代码如下: ...
- ios开发多线程篇--异步加载网络图片GCD
一.异步加载网络图片 1.ATS (1)简介 从iOS9.0开始,如果按照以前的方式写代码,在访问网络的时候 ,会报以下警告信息: App Transport Security has blocked ...
- Python爬虫获取异步加载站点pexels并下载图片(Python爬虫实战3)
Python爬虫获取异步加载站点pexels并下载图片(Python爬虫实战3) 1. 异步加载爬虫 对于静态页面爬虫很容易获取到站点的数据内容,然而静态页面需要全量加载站点的所有数据,对于网站的访问 ...
- android异步加载图片并缓存到内存和sd卡上,Android批量图片加载经典系列——采用二级缓存、异步加载网络图片...
http://www.cnblogs.com/jerehedu/p/4560119.html 2015-06-08 09:20 by 杰瑞教育, 232 阅读, 1 评论, 收藏, 编辑一.问题描述 ...
最新文章
- springmvc如何访问静态文件,例如jpg,js,css
- simplexml php,php的simplexml
- C#实现缩放和剪裁图片的方法示例
- Latex与VSCode环境搭建问题解决
- Missing artifact net.sf.json-lib:json-lib:jar:2.4错误和Eclipse安装Maven插件错误
- android handler封装_Handler都没搞懂,你拿什么去跳槽啊?!
- 8. 吴恩达机器学习课程-作业8-异常检测和推荐系统
- 蒋鑫鸿:9.7国际黄金、纸白银行情走势分析、原油操作建议
- Python显示其他字体(韩语),通过安装字体来实现
- vue 手风琴效果_Vue实现侧边菜单栏手风琴效果实例代码
- 智能语音计算器(三)
- Python玩转《生僻字》
- pos机骗局收取押金如何投诉-真实案列解答
- 一文掌握华为全过程项目管理的方法步骤和具体动作【墙裂推荐】
- VGG16预训练学习笔记
- 1 什么叫多媒体计算机,选择1多媒体计算机中的媒体信息是指()文字声音.ppt
- Python爬虫爬取天天基金网
- 如何把股票数据导出excel?导出股票历史数据到Excel的方法
- 深度剖析:如何实现一个 Virtual DOM 算法
- Java(Java SE7) 体系结构图