package com.example.gridview;

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; import android.annotation.SuppressLint;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.widget.ImageView; @SuppressLint("HandlerLeak")
public class AsyncBitmapLoader{ /**
* 内存图片软引用缓
*/
@SuppressWarnings("rawtypes")
private final HashMap<String, SoftReference> imageCache = new HashMap<String, SoftReference>(); @SuppressWarnings("rawtypes")
public Bitmap loadBitmap(final ImageView imageView, final String imageURL, final ImageCallBack imageCallBack){ SoftReference reference = imageCache.get(imageURL); //在内存缓存中,则返回Bitmap对象
if (null != reference && null != reference.get()) {
return (Bitmap) reference.get();
} else { if (null != reference) {
imageCache.remove(reference);
}
// 加上一个对本地缓存的查找
String bitmapName = toTransverseLine(imageURL.substring(imageURL.indexOf("//") + )); File cacheDir = new File("/mnt/sdcard/text/");
File[] cacheFiles = cacheDir.listFiles();
int i = ; if (null != cacheFiles) {
for (i = ; i < cacheFiles.length;i++ ){
if (bitmapName.equals(cacheFiles[i].getName())) {
break;
}
} if (i < cacheFiles.length) {
return BitmapFactory.decodeFile("/mnt/sdcard/text/" + bitmapName);
} } } final Handler handler = new Handler(){
public void handleMessage(Message msg){
imageCallBack.imageLoad(imageView, (Bitmap)msg.obj);
}
}; //如果不在内存缓存中,也不在本地(被jvm回收掉),则开启线程下载图片
new Thread(){
public void run(){
InputStream bitmapIs = getStreamFromURL(imageURL);
Bitmap bitmap = BitmapFactory.decodeStream(bitmapIs); if (bitmap == null ) {
return ;
} imageCache.put(imageURL, new SoftReference(bitmap));
Message msg = handler.obtainMessage(, bitmap);
handler.sendMessage(msg); File dir = new File("/mnt/sdcard/text/"); if (!dir.exists()) {
dir.mkdirs();
} // 下载图片保存到指定路径
String path = "/mnt/sdcard/text/" +
toTransverseLine(imageURL.substring(imageURL.indexOf("//") + )); String path1 = "/mnt/sdcard/image/"; File bitmapFile = new File(path);
FileOutputStream fos = null; if (!bitmapFile.exists()) {
try{
bitmapFile.createNewFile();
fos = new FileOutputStream(bitmapFile);
bitmap.compress(Bitmap.CompressFormat.PNG,, fos);
}catch (IOException e) {
e.printStackTrace();
}finally {
try {
if (fos != null) {
fos.close();
} } catch (IOException e) {
e.printStackTrace();
}
}
}
}
}.start(); return null;
} /**
* 转换名称保存
* @param url
* @return
*/
private String toTransverseLine(String url) {
String name1 = url.replaceAll("/", "_");
String name2 = name1.replaceAll("\\.", "_");
String name3 = name2.replaceAll("\\:", "_");
return name3;
} public interface ImageCallBack{
public void imageLoad(ImageView imageView, Bitmap bitmap);
} /**
* 通过url请求图片
* @return
*/
public static InputStream getStreamFromURL(String imageURL) {
InputStream in=null;
try {
if (imageURL != null && !imageURL.equals("")) {
URL url=new URL(imageURL);
HttpURLConnection connection=(HttpURLConnection) url.openConnection();
in=connection.getInputStream();
}
} catch (Exception e) {
e.printStackTrace();
}
return in;
} // =======================下边是调用 写在activity中========================
private String mNewsPicUrl; // 新闻图片的url
private AsyncBitmapLoader asyncBitmapLoader; // 异步加载
private ImageView mHeadImage; /**
* 显示图片
*
*/
private void showImage() { if (mNewsPicUrl != null && !mNewsPicUrl.equals("")) {
Bitmap bitmap = asyncBitmapLoader.loadBitmap(mHeadImage, mNewsPicUrl, new ImageCallBack() {
public void imageLoad(ImageView imageView, Bitmap bitmap) {
imageView.setImageBitmap(bitmap);
}
}); if (bitmap != null) {
mHeadImage.setImageBitmap(bitmap);
}else {
// mHeadImage.setVisibility(View.GONE);
}
}else {
mHeadImage.setVisibility(View.GONE);
}
} }

listview异步加载sd卡图片的更多相关文章

  1. Android加载SD卡目录,文件夹遍历,图片设置,设置文件对应打开方式等

    此案例主要说的是Android使用GridView加载SD卡下所有目录,文件夹多层遍历,文件图标修改,设置文件对应打开方式等功能. 如图: 代码: public class GridViewFile ...

  2. android listview 异步加载图片并防止错位

    网上找了一张图, listview 异步加载图片之所以错位的根本原因是重用了 convertView 且有异步操作. 如果不重用 convertView 不会出现错位现象, 重用 convertVie ...

  3. ListView异步加载图片,完美实现图文混排

    昨天参加一个面试,面试官让当场写一个类似于新闻列表的页面,文本数据和图片都从网络上获取,想起我还没写过ListView异步加载图片并实现图文混排效果的文章,so,今天就来写一下,介绍一下经验. Lis ...

  4. Android中ListView异步加载图片错位、重复、闪烁问题分析及解决方案

    我们在使用ListView异步加载图片的时候,在快速滑动或者网络不好的情况下,会出现图片错位.重复.闪烁等问题,其实这些问题总结起来就是一个问题,我们需要对这些问题进行ListView的优化. 比如L ...

  5. Android 实现ListView异步加载图片

    ListView异步加载图片是非常实用的方法,凡是是要通过网络获取图片资源一般使用这种方法比较好,用户体验好,下面就说实现方法,先贴上主方法的代码: package cn.wangmeng.test; ...

  6. 又优化了一下 Android ListView 异步加载图片

    写这篇文章并不是教大家怎么样用listview异步加载图片,因为这样的文章在网上已经有很多了,比如这位仁兄写的就很好: http://www.iteye.com/topic/685986 我也是因为看 ...

  7. Android的ListView异步加载图片时,错位、重复、闪烁问题的分析及解决方法

    Android ListView异步加载图片错位.重复.闪烁分析以及解决方案,具体问题分析以及解决方案请看下文. 我们在使用ListView异步加载图片的时候,在快速滑动或者网络不好的情况下,会出现图 ...

  8. listview异步加载图片并防止错位

    android listview 异步加载图片并防止错位 网上找了一张图, listview 异步加载图片之所以错位的根本原因是重用了 convertView 且有异步操作. 如果不重用 conver ...

  9. ListView异步加载图片

    ListView异步加载图片是非常实用的方法,凡是是要通过网络获取图片资源一般使用这种方法比较好,用户体验好,下面就说实现方法,先贴上主方法的代码: package cn.wangmeng.test; ...

随机推荐

  1. 什么是SysWow64

    转自 什么是SysWow64 Wow!什么是Wow64 64位的Windows并不是简单地把所有东西都编译成64位就万事大吉的.关于64位的CPU应该做成什么样子,Intel和AMD曾有各自的打算.A ...

  2. iOS测试一段代码的运行时间

    王刚韧 23:19:26测试一段代码的运行时间 测试一段代码运行花了多久: NSDate* tmpStartData = [NSDate date] ;<#代码#> double delt ...

  3. 访问 HTML中元素的方法

    http://www.w3school.com.cn/jsref/index.asp   1.document.getElementbyId("id1"),Html中,名称是id1 ...

  4. HDU 4708 Rotation Lock Puzzle(模拟)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4708 题目大意:给定一个方形矩阵,边长为3-10的奇数.每一圈的数字可以沿着顺时针方向和逆时针方向旋转 ...

  5. Codevs 3729 飞扬的小鸟

    飞扬的小鸟 标签 动态规划 NOIp提高组 2014 难度 提高+/省选- 题目描述 Flappy Bird 是一款风靡一时的休闲手机游戏.玩家需要不断控制点击手机屏幕的频率来调节小鸟的飞行高度,让小 ...

  6. ZJK的黑OJ(树的最大独立集)(树形DP)

    ZJK的黑OJ zjk开了一家"善良OJ".这其实是家黑OJ.每AC一道题,网站便会自动在电脑上安装一种木马.zjk通过窃取信息获取收益(如网游帐号.OI资料.和KK的照片等等). ...

  7. 2016.08.07计算几何总结测试day2

    T1 bzoj: [Usaco2010 OPen]Triangle Counting 数三角形 看到这个题n那么大, 于是想到极角排序搞一搞,然而排完序后立马懵逼,完全不知道接下来应该怎么写.... ...

  8. cocos2dx如何添加popScene的场景动画

    说明 我们很容易在pushScene中添加动画 Director::getInstance()->pushScene(TransitionSlideInB::create(SCENE_TIME, ...

  9. mysql 主从一致性检查

    我上一次遇到MySQL主从服务器数据一致性问题,想想是几年前的事情了,还依稀记得当时惊慌失措的情景,好在最后借助Maatkit解决了问题.几年后,当我再次面对同样的问题时,Maatkit已经不复存在, ...

  10. 【原创】Linux opensource-src-4.3.2.tar.gz的安装。

    下载好opensource-src-4.3.2.tar.gz 安装G++等必备库: sudo apt-get install make gcc g++ sudo apt-get install bui ...