`
yunlonglove
  • 浏览: 242726 次
社区版块
存档分类
最新评论

android Listview 软引用SoftReference异步加载图片

 
阅读更多

网上软应用的例子很多,我也是借鉴别人修改了下,推荐一个网址:http://www.iteye.com/topic/685986

之前总是不太理解,今天认真的推敲下,记录下来方便以后用到.

HashMap<String, SoftReference<Drawable>> imageCache 关于SoftReference这个类多少知道些机制,会用就ok了。

机制:简单来说,她会帮助我们管理内存,防止内存溢出,另外一点也就相当于map,临时缓存些图片drawable让我们可以直接引用,很好了解决了OOM异常.

实现代码片段:

package com.Tianyou.Mobile.Common;

import java.io.IOException;
import java.io.InputStream;
import java.lang.ref.SoftReference;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.HashMap;

import com.Tianyou.Mobile.Util.MyUtil;

import android.graphics.Bitmap;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.os.Handler;
import android.os.Message;

/***
 * 异步加载图片 缓存的实现
 * 
 * @author jia
 * 
 */
public class AsyncImageLoader {
	// 软引用
	private HashMap<String, SoftReference<Drawable>> imageCache;

	public AsyncImageLoader() {
		imageCache = new HashMap<String, SoftReference<Drawable>>();
	}

	/***
	 * 下载图片
	 * 
	 * @param imageUrl
	 *            图片地址
	 * @param imageCallback
	 *            回调接口
	 * @return
	 */
	public Drawable loadDrawable(final String imageUrl,
			final ImageCallback imageCallback) {
		if (imageCache.containsKey(imageUrl)) {
			SoftReference<Drawable> softReference = imageCache.get(imageUrl);
			Drawable drawable = softReference.get();
			if (drawable != null) {
				return drawable;
			}
		}
		final Handler handler = new Handler() {
			public void handleMessage(Message message) {
				imageCallback.imageLoaded((Drawable) message.obj, imageUrl);
			}
		};
		// 开启线程下载图片
		new Thread() {
			@Override
			public void run() {
				Drawable drawable = loadImageFromUrl(imageUrl);
				// 将下载的图片保存至缓存中
				imageCache.put(imageUrl, new SoftReference<Drawable>(drawable));
				Message message = handler.obtainMessage(0, drawable);
				handler.sendMessage(message);
			}
		}.start();
		return null;
	}

	/***
	 * 根据URL下载图片(这里要进行判断,先去本地sd中查找,没有则根据URL下载,有则返回该drawable)
	 * 
	 * @param url
	 * @return
	 */
	public static Drawable loadImageFromUrl(String imageURL) {

		Bitmap bitmap = MyUtil.GetBitmap(imageURL, 100);
		Drawable drawable = new BitmapDrawable(bitmap);
		return drawable;

	}

	// 回调接口
	public interface ImageCallback {
		public void imageLoaded(Drawable imageDrawable, String imageUrl);
	}

}
上面这个类斯通见惯了,大部分都是这样实现的,我现在要讲一点,也是迷惑我很久了一点(回调接口运用)本人基础不好,所以卡在这里了,

在listview中的getview方法中要调用这个方法:

代码片段:

public Drawable getDrawable(AsyncImageLoader asyncImageLoader,
			String imageUrl, final ImageView imageView) {
		Drawable drawable = asyncImageLoader.loadDrawable(imageUrl,
				new ImageCallback() {
					@Override
					public void imageLoaded(Drawable imageDrawable,
							String imageUrl) {
						if (imageDrawable != null)
							imageView.setImageDrawable(imageDrawable);
						else
							imageView.setImageResource(R.drawable.u6_normal);
					}
				});
		return drawable;
	}
这个方法作用:获取软用中的图片,其实在我们首次进入listview中的时候,软应用是不起作用的,只是用来下载图片保存至sd卡和软引用中.这个方法就是执行了这些操作,对于参数imageView 就是在要把获取的drawable设置进去.

执行的顺利:首先我们调用的是loadDrawable这个方法,然后查找软引用中有没有该drawable,没有的话则线程下载,下载ok后会执行handleMessage中imageCallback.imageLoaded((Drawable) message.obj, imageUrl);然后执行我们已经实现了这个接口.

在getiview 中执行代码片段:

	Drawable drawable = getDrawable(asyncImageLoader, Image_L,
					holder.iv_image);
			
			if(drawable!=null)
				holder.iv_image.setImageDrawable(drawable);
当我们下滑动后,然后在上滑动的时候软应用起到了效果,效率很快哦,可以和新浪聘美了,呵呵,玩笑,要优化的地方还很多.


回调函数的确很棒,只能怪自己基础不好了,得好好补一补了.

就说这么多了,有什么不对的地方请留下吉言,共同学习.









分享到:
评论

相关推荐

    Android实现ListView异步加载图片

    "Android实现ListView异步加载图片" Android 实现 ListView 异步加载图片是一种常见的技术,旨在提高应用程序的性能和用户体验。本文将详细介绍 Android 中实现 ListView 异步加载图片的方法,并对相关的技术概念...

    ListView异步加载图片

    为了解决这个问题,我们需要实现ListView的异步加载图片功能。本篇文章将详细介绍如何通过软引用缓存图片,实现高效、流畅的异步加载机制。 一、异步加载原理 异步加载的基本思想是将耗时的操作(如网络请求和图片...

    安卓Android源码——listview实现图片的异步加载.rar

    异步加载图片的基本思想是将耗时的网络请求或本地磁盘读取操作放到后台线程进行,防止阻塞UI更新。以下是一些关键知识点: 1. **AsyncTask**: Android提供了一个轻量级的异步任务类,AsyncTask,它可以让你在后台...

    Android代码-listview实现图片的异步加载.rar

    异步加载图片的基本思想是将图片加载操作放在后台线程进行,避免阻塞主线程。主线程负责UI更新,而后台线程负责网络请求或读取本地资源。这样,即使图片加载需要时间,也不会影响到用户的界面交互。 2. **...

    android listView 异步加载图片

    总的来说,Android ListView中的异步加载图片是一项重要的性能优化技术。通过选择合适的库,配置合理的加载策略,并结合内存和磁盘缓存,我们可以实现高效、流畅的图片加载效果,提升用户对应用的满意度。

    ListView利用内存缓存异步加载网络大图Demo

    "ListView利用内存缓存异步加载网络大图Demo"是一个解决这些问题的实践案例,它主要关注如何优化Bitmap的加载和显示,以提升用户体验。 Bitmap是Android中用于处理图像的基本类,但其内存消耗不容忽视。一张高清大...

    ListView异步加载网络图片

    总之,ListView异步加载网络图片是一项关键技术,它涉及到Android多线程、内存管理和图片缓存策略。合理地运用这些技术,可以构建出性能优良、用户体验良好的应用。同时,使用SoftReference可以平衡内存使用和图片...

    ListView异步加载图片和文字,避免内存溢出和滑动效率

    三、异步加载图片 1. 使用开源库:诸如Picasso、Glide、 Fresco等第三方库,它们提供了自动缓存、异步加载等功能,能有效地减少内存占用和提高加载速度。 2. 自定义解决方案:通过AsyncTask或Handler/Looper机制,在...

    Android实现异步加载图片

    在Android应用开发中,异步加载图片是一项基本且重要的任务,尤其在处理大量图片或滑动列表时,如ListView、RecyclerView等。异步加载能够避免因加载图片导致的UI卡顿,提高用户体验。本篇文章将详细讲解如何在...

    Android 使用软引用解决listView卡顿问题

    当我们需要加载图片时,首先检查软引用是否仍然有效,如果有效则直接使用,否则异步加载新的图片并更新软引用。 这样做的好处是,即使在内存紧张时,垃圾回收器也可以回收那些不再显示在屏幕上的图片,从而降低内存...

    ListView异步加载并缓存图片

    在这个特定的例子中,采用了异步加载图片,并结合了LruCache和软引用的技术,进一步提高了效率。 LruCache(Least Recently Used Cache)是Android SDK提供的一个内存缓存机制,基于LRU(最近最少使用)算法。它会...

    android listview 异步下载 优化1

    4. **图片库的使用**:在Android中,有许多开源的图片加载库,如Glide、Picasso、Universal Image Loader等,它们都支持异步加载、缓存管理等功能。这些库可以更好地处理图片的加载、解码、缩放和缓存,从而优化性能...

    android异步加载图片.txt

    ### Android异步加载图片知识点详解 #### 一、概述 在Android开发中,为了提高用户体验,减少因加载图片导致的界面卡顿问题,通常会采用异步加载图片的技术。这种方式可以确保用户在浏览应用时不会因为等待图片...

    Android实现ListView异步加载图片的方法

    因此,使用异步加载图片是提高性能和优化用户体验的关键。 在给定的实例中,开发者实现了一个名为`AsyncImageLoader`的类,这个类的主要目的是在后台线程中加载网络图片,并在加载完成后更新UI线程。以下是对这个类...

    知识共享-Android之ListView滑动加载、软缓存、懒加载(雷惊风)

    - 适当地使用异步加载,避免阻塞UI线程。 - 数据分页加载,避免一次性加载过多数据。 - 考虑数据的生命周期管理,及时清理不再使用的缓存。 - 对于大数据量的情况,可以考虑使用RecyclerView替代ListView,它有...

    android gridview/listview加载大量图片

    2. 将getView中需要加载的图片添加进堆栈,启动异步线程从栈顶开始加载图片,保证当前显示区域的图片被先显示。 3. 调整Load线程优先级为Thread.NORM_PRIORITY-1,不要和UI线程抢时间片,使滚动更流畅。 该代码用...

    Android实现从缓存中读取图片与异步加载功能类.zip

    Android中的`AsyncTask`或者`Handler`/`Looper`机制可以实现异步加载图片,而现在更流行的库如Glide、Picasso等,提供了更为便捷的异步加载解决方案。 3. **Glide和Picasso**: Glide和Picasso是Android开发中常用...

    android图片异步加载缓存

    "Android图片异步加载缓存"是一个关键的技术概念,它涉及到如何有效地管理内存和磁盘资源,优化用户体验,避免因加载大图或频繁加载图片导致应用卡顿甚至崩溃。以下是对这个主题的详细解释: 1. **异步加载**:...

Global site tag (gtag.js) - Google Analytics