一、简介

二、代码流程

1.private Map<String, SoftReference<Drawable>> imageCache = new HashMap<String, SoftReference<Drawable>>();来起到缓存图片的作用

2.每当要访问图片,先在map找,找不到则new Thread().start(),访问网络得到图片,再传给handler,

Message message = handler.obtainMessage(0, drawable);
handler.sendMessage(message);

3.handler若收到message 就产生回调,没轩imageView的图片信息callback.imageLoaded((Drawable) msg.obj);

三、代码
1.xml
(1)activity_main.xml

 <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/hello"
/>
<ImageView
android:id="@+id/imageView01"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/icon"
/>
<ImageView
android:id="@+id/imageView02"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/icon"
/>
<ImageView
android:id="@+id/imageView03"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/icon"
/>
</LinearLayout>

(2)AndroidManifest.xml

 <uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.READ_CONTACTS" />

2.java
(1)MainActivity.java

 import android.app.Activity;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.widget.ImageView; public class MainActivity extends Activity {
/** Called when the activity is first created. */
private AsyncImageLoader loader = new AsyncImageLoader();
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
loadImage("http://www.android.com/images/icon-partners.png", R.id.imageView01);
loadImage("http://www.android.com/images/icon-dev.png", R.id.imageView02);
loadImage("http://www.android.com/images/icon-market.png", R.id.imageView03);
}
//url:下载图片的URL
//id:ImageView控件的ID
private void loadImage(final String url, final int id) {
// 如果缓存过就会从缓存中取出图像,ImageCallback接口中方法也不会被执行
ImageView imageView = (ImageView)findViewById(id);
//把imageVieww传给CallbackImpl,回调时就可以设置图片
CallbackImpl callbackImpl = new CallbackImpl(imageView);
Drawable cacheImage =
loader.loadDrawable(url, callbackImpl);
if (cacheImage != null) {
imageView.setImageDrawable(cacheImage);
}
}
}

(2)AsyncImageLoader.java

 import java.lang.ref.SoftReference;
import java.net.URL;
import java.util.HashMap;
import java.util.Map; import android.graphics.drawable.Drawable;
import android.os.Handler;
import android.os.Message; //该类的主要作用是实现图片的异步加载
public class AsyncImageLoader {
//图片缓存对象
//键是图片的URL,值是一个SoftReference对象,该对象指向一个Drawable对象
//这样并不影响image被garbage collecter回收
private Map<String, SoftReference<Drawable>> imageCache =
new HashMap<String, SoftReference<Drawable>>(); //实现图片的异步加载
public Drawable loadDrawable(final String imageUrl,final ImageCallback callback){
//查询缓存,查看当前需要下载的图片是否已经存在于缓存当中
if(imageCache.containsKey(imageUrl)){
SoftReference<Drawable> softReference=imageCache.get(imageUrl);
if(softReference.get() != null){//如果为null,则说明被垃圾回收器回收了
return softReference.get();
}
} //Handler和UI是同一线程的
final Handler handler=new Handler(){
@Override
public void handleMessage(Message msg) {
//msg.obj是handler.obtainMessage(0, drawable);传过来的
callback.imageLoaded((Drawable) msg.obj);
}
}; //如果缓存没有,则新开辟一个线程,该线程用于进行图片的下载
//每下载一个图片,都 会开辟一个新线程,和UI不是同一线程的
new Thread(){
public void run() {
Drawable drawable=loadImageFromUrl(imageUrl);
//把图片加到map中,以缓存图片,则下次访问不用访问网络
imageCache.put(imageUrl, new SoftReference<Drawable>(drawable));
Message message = handler.obtainMessage(0, drawable);
handler.sendMessage(message);
};
}.start();
return null;//这里不能return drawable,因为它是在另一个线程,此时drawable可能还没值
}
//该方法用于根据图片的URL,从网络上下载图片
protected Drawable loadImageFromUrl(String imageUrl) {
try {
//根据图片的URL,下载图片,并生成一个Drawable对象
return Drawable.createFromStream(new URL(imageUrl).openStream(), "src");
} catch (Exception e) {
throw new RuntimeException(e);
}
} //回调接口
public interface ImageCallback{
public void imageLoaded(Drawable imageDrawable);
}
}

(3)CallbackImpl.java

 import android.graphics.drawable.Drawable;
import android.widget.ImageView; public class CallbackImpl implements AsyncImageLoader.ImageCallback{
private ImageView imageView ; public CallbackImpl(ImageView imageView) {
super();
this.imageView = imageView;
} @Override
public void imageLoaded(Drawable imageDrawable) {
imageView.setImageDrawable(imageDrawable);
} }

ANDROID_MARS学习笔记_S04_009_用java.lang.ref.SoftReference作缓存,android.os.Handler和new Thread异步加载略图片的更多相关文章

  1. Java学习笔记之——this关键字、非静态成员属性和静态成员属性的区别、类的加载顺序

    一.this关键字 1.代表当前类的对象 2.通过” . ”调用成员属性和成员方法 3.通过this可以区分成员属性和参数 参数名和属性名相同的情况,默认是参数名 二.非静态成员属性和静态成员属性的区 ...

  2. 深入探讨 java.lang.ref 包--转

    概述 Java.lang.ref 是 Java 类库中比较特殊的一个包,它提供了与 Java 垃圾回收器密切相关的引用类.这些引用类对象可以指向其它对象,但它们不同于一般的引用,因为它们的存在并不防碍 ...

  3. Android学习笔记(二)之异步加载图片

    最近在android开发中碰到比较棘手的问题,就是加载图片内存溢出.我开发的是一个新闻应用,应用中用到大量的图片,一个界面中可能会有上百张图片.开发android应用的朋友可能或多或少碰到加载图片内存 ...

  4. wemall app商城源码中基于JAVA的Android异步加载图片管理器代码

    wemall doraemon是Android客户端程序,服务端采用wemall微信商城,不对原商城做任何修改,只需要在原商城目录下上传接口文件即可完成服务端的配置,客户端可随意定制修改.本文分享其中 ...

  5. 学习笔记(三)--->《Java 8编程官方参考教程(第9版).pdf》:第十章到十二章学习笔记

    回到顶部 注:本文声明事项. 本博文整理者:刘军 本博文出自于: <Java8 编程官方参考教程>一书 声明:1:转载请标注出处.本文不得作为商业活动.若有违本之,则本人不负法律责任.违法 ...

  6. 深入探讨 java.lang.ref 包

    深入探讨 java.lang.ref 包 本文主要探讨了 java.lang.ref 包的使用方法,以及源码解读.并就该包在不同 JVM 上的表现进行了比较与分析.通过阅读本文,读者可以加深对 jav ...

  7. Android学习问题记录之java.lang.UnsatisfiedLinkError

    1.问题描述 Android Studio引入第三方类库时,出现错误java.lang.UnsatisfiedLinkError: 11-09 14:58:05.500 13280-13280/cn. ...

  8. ANDROID_MARS学习笔记_S01原始版_023_MP3PLAYER005_用广播BroacastReciever实现后台播放不更新歌词

    一.代码流程1.自定义一个AppConstant.LRC_MESSAGE_ACTION字符串表示广播"更新歌词" 2.在PlayerActivity的onResume()注册Bro ...

  9. ANDROID_MARS学习笔记_S01原始版_023_MP3PLAYER004_同步显示歌词

    一.流程分析 1.点击播放按钮,会根据lrc名调用LrcProcessor的process()分析歌词文件,得到时间队列和歌词队列 2.new一个hander,把时间队列和歌词队列传给自定义的线程类U ...

随机推荐

  1. How to fix “The program can’t start because MSVCR110.dll is missing from your computer.” error on Windows

    原文出处 How to fix “The program can’t start because MSVCR110.dll is missing from your computer.” error ...

  2. Apache Avro 与 Thrift 比较

    http://www.tbdata.org/archives/1307 Avro和Thrift都是跨语言,基于二进制的高性能的通讯中间件. 它们都提供了数据序列化的功能和RPC服务. 总体功能上类似, ...

  3. C#微信公众号开发 -- (四)获取API调用所需的全局唯一票据access_token

    access_token是公众号的全局唯一票据,公众号调用各接口时都需使用access_token.开发者需要进行妥善保存.access_token的存储至少要保留512个字符空间.access_to ...

  4. ASP.NET 设计模式中依赖倒置原则

    依赖倒置原则 A.高层次的模块不应该依赖于低层次的模块,他们都应该依赖于抽象. B.抽象不应该依赖于具体,具体应该依赖于抽象. 依赖倒置原则 A.高层次的模块不应该依赖于低层次的模块,他们都应该依赖于 ...

  5. ubuntu网络连接图标不显示

    sudo emacs /etc/NetworkManager/nm-system-settings.conf 将managed的值改为true,保存退出. sudo service network-m ...

  6. virtualbox安装ubuntu出现“The system is running in low-graphics mode”

    cd /etc/X11 sudo mv xorg.conf.failsafe xorg.conf sudo reboot 即可.

  7. 【转】字符编码笔记:ASCII,Unicode和UTF-8

    今天整理笔记,关于NSString转NSData时,什么时候使用NSUTF8StringEncoding,或者NSASCIIStringEncoding,或者 NSUnicodeStringEncod ...

  8. Speak softly love

    Speak softly love and hold me warm against your heart 柔声诉情,拥我在你暖暖的心上 I feel your words, the tender t ...

  9. AJAX 简单上手

    AJAX简介 没有AJAX会怎么样?普通的ASP.Net每次执行服务端方法的时候都要刷新当前页面,如实现显示服务器的时间每次都要刷新页面的坏处:页面刷新打断用户操作.速度慢.增加服务器的流量压力.如果 ...

  10. 4MLinux7.0 服务器配置详解 别名TheSSS

    TheSSS download 特性:thttp,php5.5.1,mysql,vsftp,proxy,firewall,带rpm管理器.更新频繁. 官方帮助文件:View (新窗口打开) 发现国内4 ...