SyncImageLoader 图片异步下载工具类
package mars.async.down.utils;
import java.lang.ref.SoftReference;
import java.net.URL;
import java.util.HashMap;
import android.graphics.drawable.Drawable;
import android.os.Handler;
import android.os.Message;
public class SyncImageLoader {
private HashMap<String, SoftReference<Drawable>> imageCache = new HashMap<String, SoftReference<Drawable>>();
// 根据URL从网络上下载图片,生成Drawable对象
public Drawable loadImageFormUrl(String imageUrl) {
try {
return Drawable.createFromStream(new URL(imageUrl).openStream(),
"src");
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException(e);
}
}
public Drawable loadDrawable(final String imageUrl,
final ImageCallback imageCallback) {
// 判断缓存中是否有imageUrl这个缓存存在
if (imageCache.containsKey(imageUrl)) {
SoftReference<Drawable> softReference = imageCache.get(imageUrl);
if (softReference.get() != null) {
return softReference.get();
}
}
final Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
imageCallback.imageLoaded((Drawable) msg.obj);
}
};
// 缓存中不存在的话,启动异步线程下载图片
new Thread() {
@Override
public void run() {
// 将图片放入缓存
Drawable drawable = loadImageFormUrl(imageUrl);
imageCache.put(imageUrl, new SoftReference<Drawable>(drawable));
Message msg = handler.obtainMessage(0, drawable);
handler.sendMessage(msg);
}
}.start();
return null;
}
// 回调函数,图片加载完毕后调用该函数
public interface ImageCallback {
public void imageLoaded(Drawable imageDrawable);
}
}
CallbackImplements 回调接口实现类。
package mars.async.down.utils;
import android.graphics.drawable.Drawable;
import android.widget.ImageView;
public class CallbackImplements implements SyncImageLoader.ImageCallback {
private ImageView imageView;
public CallbackImplements(ImageView imageView) {
super();
this.imageView = imageView;
}
@Override
public void imageLoaded(Drawable imageDrawable) {
imageView.setImageDrawable(imageDrawable);
}
}
在Activity中调用
package mars.async.down;
import mars.async.down.utils.CallbackImplements;
import mars.async.down.utils.SyncImageLoader;
import android.app.Activity;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.widget.ImageView;
public class MainActivity extends Activity {
private SyncImageLoader syncImageLoader = new SyncImageLoader();
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
loadImage("http://www.android.com/images/icon-partners.png",
R.id.imageView1);
loadImage("http://www.android.com/images/icon-dev.png", R.id.imageView2);
loadImage("http://www.android.com/images/icon-market.png",
R.id.imageView3);
}
// url:图片的url地址
// id:ImageView控件的ID
private void loadImage(String url, int id) {
ImageView imageView = (ImageView) findViewById(id);
CallbackImplements callbackImplements = new CallbackImplements(
imageView);
Drawable cacheImage = syncImageLoader.loadDrawable(url,
callbackImplements);
// 如果图片缓存存在,则在外部设置image.否则是调用的callback函数设置
if (cacheImage != null) {
imageView.setImageDrawable(cacheImage);
}
}
}
分享到:
相关推荐
在Android开发中,异步加载图片是一个非常常见的需求,特别是在构建UI时,为了提供良好的用户体验,我们通常会避免在主线程中执行耗时的操作,如网络请求和图片解码。本教程将深入探讨如何利用异步操作来实现从...
一、Android异步下载图片 在Android中,由于性能和用户体验考虑,不应在主线程中进行网络请求或处理耗时操作,包括下载图片。为了解决这个问题,可以使用异步加载图片的技术,例如: 1. **AsyncTask**: Android提供...
Android异步下载网络图片 (三个全) Android异步下载网络图片 (三个全) Android异步下载网络图片 (三个全) Android异步下载网络图片 (三个全) Android异步下载网络图片 (三个全) Android异步下载网络图片 ...
这里的"android 异步下载图片(缓冲)"指的是使用异步方式从网络获取图片,并结合缓冲策略来优化用户体验。 Mars老师的视频教程可能详细讲解了这一过程。 首先,我们要理解异步加载的含义。在Android中,主线程负责...
在Android应用开发中,图片异步下载是一项至关重要的技术,特别是在构建内容丰富的应用程序时,如社交媒体、电商或者新闻阅读应用。这些应用往往需要加载大量的图片,如果采用同步方式下载,可能会导致用户界面阻塞...
本篇文章将深入探讨`AsyncTask`在Android中用于异步下载图片的应用。 `AsyncTask`类包含三个泛型参数,分别代表参数类型(Params)、进度类型(Progress)和结果类型(Result)。在下载图片的场景中,我们可能不...
一种常见的异步图片加载库是Universal Image Loader (UIL),但现在更推荐使用Glide或Picasso。这些库都提供了简洁的API,能轻松实现图片的异步加载、缓存管理和内存优化。 以Glide为例,我们可以这样使用它来加载...
总之,Android异步批量下载图片并缓存是提高应用性能和用户体验的重要手段。理解并掌握这个过程,不仅需要对Android的多线程编程有深入理解,还需要熟悉图片加载库的使用以及内存和磁盘缓存的管理。提供的源码示例是...
本文将深入探讨如何使用`AsyncTask`、`New Thread`以及`Handler`来实现Android应用中的异步图片下载。 首先,让我们了解`AsyncTask`。`AsyncTask`是Android提供的一个轻量级的后台执行框架,用于执行耗时操作,以...
在Android开发中,异步下载图片是一个常见的需求,特别是在构建应用程序时,为了提供良好的用户体验,我们需要在后台加载图片,而不是阻塞主线程。本篇将深入探讨如何实现异步下载图片并返回Bitmap以及图片的本地...
Android异步下载图片并且缓存图片到本地DEMO详解 在Android开发中,经常需要从服务器上下载数据,包括图片资源。为了提高应用程序的性能和用户体验,需要实现异步下载图片并且缓存图片到本地。下面将详细介绍...
本话题主要围绕"android异步加载图片缓存释放"展开,我们将深入探讨如何实现这个功能以及相关的知识点。 首先,异步加载图片的目的是为了让用户在浏览应用时不会因为网络请求而等待,提高应用的响应速度。通常,...
"Android异步加载图片"是一个常见的需求,它涉及到用户体验优化、内存管理以及线程安全等多个方面。这里我们将深入探讨这个主题,并结合提供的"ImageLoader-develop"可能是一个图片加载库的源码,来讲解相关的知识点...
综上所述,Android异步加载图片和缓存策略是提升应用性能的关键技术。通过合理使用工作线程和缓存机制,可以显著改善用户体验,降低系统负载。在实际开发中,选择合适的图片加载库,并结合最佳实践,能够帮助我们...
在Android开发中,异步加载网络图片是一项常见的需求,特别是在构建具有丰富图像内容的应用时。AsyncImageLoader 和 PicUtils 是两个关键的类,用于解决这个问题。让我们深入了解一下这两个类以及它们在Android网络...
适配器内部可以包含一个图片URL的列表,并通过一个`ImageView`的子类,比如`Glide`或`Picasso`等图片加载库来异步下载和缓存图片。这样做的好处是,即使在网络不稳定的情况下,用户也能看到之前加载过的图片,提高了...
在Android开发中,异步处理是一项关键技能,特别是在涉及到网络操作如图片下载时。`AsyncTask`是Android提供的一种轻量级的异步处理机制,适用于执行后台任务并更新UI。本篇将深入探讨如何使用`AsyncTask`来实现图片...
总结一下,Android异步下载网络图片的基本步骤包括: 1. 创建新线程或使用Runnable执行下载任务。 2. 使用URL和HttpURLConnection从服务器获取图片数据。 3. 在下载线程中创建Handler和Looper,用于与主线程通信。 4...
"Android异步请求网络图片demo"是一个示例项目,旨在演示如何在Android应用中有效地、非阻塞地下载并显示网络上的图片。这个项目的核心知识点主要包括以下几个方面: 1. **AsyncTask**: Android提供了`AsyncTask`类...