- 浏览: 87841 次
- 性别:
- 来自: 北京
最新评论
-
LiuYiJie2007:
public static String getPublicK ...
Android publickey获取 -
LiuYiJie2007:
getPublicKey( )是你自己写法方法 是什么?new ...
Android publickey获取 -
liujia9234:
我试了,不行,最不靠谱了
最靠谱的禁止ViewPager滑动方法 -
kedongjun:
非常强大
关于android通讯录加载大数据的优化问题 -
xunhuan01:
view.getImageMatrix(), savedMat ...
多点触摸放大图片的自定义listener
package cn.jd3g.utils; 002 003 import java.lang.ref.SoftReference; 004 import java.util.HashMap; 005 import java.util.LinkedHashMap; 006 import java.util.Map.Entry; 007 008 import android.graphics.Bitmap; 009 import android.os.Handler; 010 import android.util.Log; 011 import android.widget.ImageView; 012 013 /** 014 * 利用多线程异步加载图片并更新视图 015 * 016 * @author xfzhang 017 * 018 */ 019 public final class AsynImageLoader { 020 021 private LoaderThread thread;// 加载图片并发消息通知更新界面的线程 022 private HashMap<String, SoftReference<Bitmap>> imageCache;// 图片对象缓存,key:图片的url 023 private Handler handler;// 界面Activity的Handler对象 024 025 public AsynImageLoader(Handler handler) { 026 imageCache = new HashMap<String, SoftReference<Bitmap>>(); 027 this.handler = handler; 028 } 029 030 /** 031 * 加载图片前显示到指定的ImageView中,图片的url保存在视图对象的Tag中 032 * 033 * @param imageView 034 * 要显示图片的视图 035 * @param defaultBitmap 036 * 加载需要显示的提示正在加载的默认图片对象 037 */ 038 public void loadBitmap(ImageView imageView, Bitmap defaultBitmap) { 039 // 图片所对应的url,这个值在加载图片过程中很可能会被改变 040 String url = (String) imageView.getTag(); 041 if (imageCache.containsKey(url)) {// 判断缓存中是否有 042 SoftReference<Bitmap> softReference = imageCache.get(url); 043 Bitmap bitmap = softReference.get(); 044 if (bitmap != null) {// 如果图片对象不为空,则可挂接更新视图,并返回 045 imageView.setImageBitmap(bitmap); 046 return; 047 } else {// 如果为空,需要将其从缓存中删除(其bitmap对象已被回收释放,需要重新加载) 048 Log.e("TAG", "cache bitmap is null"); 049 imageCache.remove(url); 050 } 051 } 052 imageView.setImageBitmap(defaultBitmap);// 先显示一个提示正在加载的图片 053 if (thread == null) {// 加载线程不存在,线程还未启动,需要新建线程并启动 054 thread = new LoaderThread(imageView, url); 055 thread.start(); 056 } else {// 如果存在,就调用线程对象去加载 057 thread.load(imageView, url); 058 } 059 060 } 061 062 /** 063 * 释放缓存中所有的Bitmap对象,并将缓存清空 064 */ 065 public void releaseBitmapCache() { 066 if (imageCache != null) { 067 for (Entry<String, SoftReference<Bitmap>> entry : imageCache.entrySet()) { 068 Bitmap bitmap = entry.getValue().get(); 069 if (bitmap != null) { 070 bitmap.recycle();// 释放bitmap对象 071 } 072 } 073 imageCache.clear(); 074 } 075 } 076 077 /** 078 * 加载图片并显示的线程 079 */ 080 private class LoaderThread extends Thread { 081 082 LinkedHashMap<String, ImageView> mTaskMap;// 需要加载图片并显示的图片视图对象任务链 083 private boolean mIsWait;// 标识是线程是否处于等待状态 084 085 public LoaderThread(ImageView imageView, String url) { 086 mTaskMap = new LinkedHashMap<String, ImageView>(); 087 mTaskMap.put(url, imageView); 088 } 089 090 /** 091 * 处理某个视图的更新显示 092 * 093 * @param imageView 094 */ 095 public void load(ImageView imageView, String url) { 096 mTaskMap.remove(imageView);// 任务链中可能有,得先删除 097 mTaskMap.put(url, imageView);// 将其添加到任务中 098 if (mIsWait) {// 如果线程此时处于等待得唤醒线程去处理任务队列中待处理的任务 099 synchronized (this) {// 调用对象的notify()时必须同步 100 this.notify(); 101 } 102 } 103 } 104 105 @Override 106 public void run() { 107 while (mTaskMap.size() > 0) {// 当队列中有数据时线程就要一直运行,一旦进入就要保证其不会跳出循环 108 mIsWait = false; 109 final String url = mTaskMap.keySet().iterator().next(); 110 final ImageView imageView = mTaskMap.remove(url); 111 if (imageView.getTag() == url) {// 判断视图有没有复用(一旦ImageView被复用,其tag值就会修改变) 112 final Bitmap bitmap = MyConnection.getBitmapByUrl(url);// 此方法应该是从网络或sd卡中加载 113 try { 114 Thread.sleep(1000);// 模拟网络加载数据时间 115 } catch (InterruptedException e1) { 116 e1.printStackTrace(); 117 } 118 // 将加载的图片放入缓存map中 119 imageCache.put(url, new SoftReference<Bitmap>(bitmap)); 120 if (url == imageView.getTag()) {// 再次判断视图有没有复用 121 handler.post(new Runnable() {// 通过消息机制在主线程中更新UI 122 @Override 123 public void run() { 124 imageView.setImageBitmap(bitmap); 125 } 126 }); 127 } 128 } 129 if (mTaskMap.isEmpty()) {// 当任务队列中没有待处理的任务时,线程进入等待状态 130 try { 131 mIsWait = true;// 标识线程的状态,必须在wait()方法之前 132 synchronized (this) { 133 this.wait();// 保用线程进入等待状态,直到有新的任务被加入时通知唤醒 134 } 135 } catch (InterruptedException e) { 136 e.printStackTrace(); 137 } 138 } 139 } 140 } 141 } 142 } 查看源码打印?01 private class ProductListAdapter extends BaseAdapter { 02 03 private AsynImageLoader mImageAsynLoader; 04 05 public ProductListAdapter() { 06 mImageAsynLoader = new AsynImageLoader(mHandler); 07 } 08 09 @Override 10 public int getCount() { 11 int size = Math.min(mLastItemViewIndex + 1, mDataList.size()); 12 mLastItemViewIndex = size - 1; 13 return size; 14 } 15 16 @Override 17 public Object getItem(int position) { 18 return mDataList.get(position); 19 } 20 21 @Override 22 public long getItemId(int position) { 23 return position; 24 } 25 26 @Override 27 public View getView(int position, View convertView, ViewGroup parent) { 28 if (convertView == null) { 29 convertView = getLayoutInflater().inflate(R.layout.product_list_item, 30 null); 31 } 32 ImageView imageView = (ImageView) convertView 33 .findViewById(R.id.iv_item_product_image); 34 Map<String, String> map = mDataList.get(position); 35 //存放图片所对应的url 36 imageView.setTag(map.get("product_pic_address")); 37 mImageAsynLoader.loadBitmap(imageView, mDefautBitmap); 38 return convertView; 39 } 40 }
发表评论
-
Android_低版本使用ActionBar
2014-08-26 11:09 1096转载 http://blog.csdn.net/tianjf0 ... -
如何屏蔽android webview高度选中框
2014-02-19 12:04 747如标题所述,解决方法是在 html的样式中加入 *{-webk ... -
屏蔽ScrollView惯性滚动的方法
2013-08-08 13:36 5714ScrollView中有一种惯性滚动的效果,想让这个Scrol ... -
android 图片LOMO效果
2013-07-25 13:59 872import android.graphics.Bitmap; ... -
GitHub最火的android 项目
2013-07-25 13:14 780GitHub在中国的火爆程度无需多言,越来越多的开源项目迁移到 ... -
listview 点击列表项时,项中的Button会触发点击效果
2013-06-05 19:21 1284开发中,难免会在列表项中, 加入Button ,而button ... -
圆形不滚动的进度条
2013-05-17 11:38 849这种效果的进度条 代码如下: package com. ... -
最靠谱的禁止ViewPager滑动方法
2013-05-15 14:44 4957最近做项目要求某种情况下ViewPager不能滑动,在网上找了 ... -
viewpager主页面响应子页面 onkeydown事件的方法
2013-05-13 19:35 1618大家在开发中不少地方要用到ViewPager这个类,ViewP ... -
Mina 学习笔记 TCP主要接口
2013-05-05 23:21 1225(1.)IoService: 这个接口 ... -
android动画插件器
2013-04-27 10:01 830首先要了解为什么需要插值器,因为在补间动画中,我们一般只定义关 ... -
imageView 的 android:maxHeight,maxWidth属性
2013-03-29 10:17 816大家使用android:maxHeight,maxWidth属 ... -
android中获取下载地址文件的类型的方法
2013-03-28 11:33 1025MimeTypeMap mimeTypeMap = Mime ... -
res与res-auto的区别
2013-03-27 14:55 3961通常我们在布局文件中使用自定义属性的时候 会这样写 xmln ... -
滑动开关控件
2013-03-26 22:39 815public class SlidButton exten ... -
TextView使用SpannableString设置复合文本
2013-03-23 23:35 8801、BackgroundColorSpan 背景色 Sp ... -
Android编程之SparseArray<E>详解
2013-03-21 23:03 985一、构造 从构造方法我 ... -
判断系统是否支持 DownloadManager服务
2013-03-18 14:25 862public static boolean isDownloa ... -
android ndk native_activity.h
2013-03-12 15:25 1768#ifndef ANDROID_NATIVE_ACTIVITY ... -
android ndk obb.h
2013-03-12 15:14 1133#ifndef ANDROID_OBB_H #define A ...
相关推荐
在Android应用开发中,图片加载是一项常见的任务,尤其是在处理大量图片或者网络图片时,为了提供良好的用户体验,我们通常会采用异步加载的方式。本篇将深入探讨Android平台上的图片异步加载策略,以及如何加载网络...
在这个"Android异步加载图片例子"中,我们将探讨如何在Android应用中实现这一功能。 首先,我们需要理解Android的主线程(UI线程)与工作线程的区别。主线程负责处理用户界面交互,而工作线程则用于执行耗时操作,...
总的来说,Android-Universal-Image-Loader为Android开发者提供了一种高效、灵活的图片异步加载解决方案,无论是ListView、GridView还是ViewPager,都可以通过其强大的功能提升用户体验。在实际开发中,掌握这个库的...
4. **同步加载策略**:虽然异步加载是提高用户体验的关键,但在某些情况下,如列表项较少或者图片大小较小时,可以考虑同步加载,以避免乱序问题。 5. **监听加载状态**:通过监听图片加载库的事件回调,可以确保在...
综上所述,"android Gridview 异步加载网络图片"是一个涉及Android UI设计、多线程编程、图片处理、缓存策略以及第三方库使用的综合主题。通过学习这个示例,开发者可以提升应用性能,提供更优质的用户体验。
本资料包主要讲解了如何使用`AsyncTask`进行异步加载图片,这对于在UI线程中保持流畅用户体验至关重要。 `AsyncTask`是Android SDK中的一个类,它为开发者提供了简单的多线程和回调功能。它的核心思想是将长时间...
这里的“android listView 异步加载图片”指的是在不阻塞UI线程的情况下,从网络、本地存储或其他来源加载图片到ListView中的技术。 这篇名为“ImageLoader”的Java文件很可能就是一个实现图片异步加载的工具类。在...
因此,我们需要采用异步加载图片的方式,同时为了优化性能,通常会采用双缓存策略。本文将详细介绍如何在ListView中实现图片的异步加载,并且在用户拖动时不加载,以提高滚动流畅性。 一、异步加载原理 异步加载是...
本文将深入探讨Android ListView中异步加载图片的策略、常见问题以及解决方案。 首先,我们要理解异步加载的基本原理。异步加载是指在后台线程中执行耗时操作,如加载图片,而主线程则继续处理用户交互,保证界面...
Android 演示异步加载图片的实现 附源代码,这里主要是演示ListView的异步加载图片功能,异步加载一个view时,如果view里面有EditText,EditText在每次加载view都会触发焦点,这时候异步就会出错。可能我这样说不太...
标题提到的“android TextView异步加载HTML(含图片)”就是一个解决此类问题的方法。 在描述中,我们看到一行代码 `tv.setText(Html.fromHtml(html1, new URLImageParser(tv), null));` 这是实现HTML加载的关键。...
在Android开发中,图片异步加载是一个至关重要的技术点,特别是在处理大量图片或者网络图片时。这不仅可以提高应用性能,防止UI线程阻塞,还能优化用户体验,避免因加载大图导致的应用卡顿。本话题将深入探讨Android...
在Android应用开发中,图片异步加载是一项至关重要的技术,特别是在处理大量图片或者网络图片时。这不仅可以提高用户体验,避免因加载图片导致的界面卡顿,还能有效节省系统资源,防止内存溢出(OOM)的发生。本文将...
在Android应用开发中,图片异步加载是一种常见的优化技术,特别是在构建类似照片墙或ListView这样的大量图片展示场景中。这个话题主要关注如何有效地处理图片资源,避免UI阻塞,提高用户体验。以下是对"图片异步加载...
在Android应用开发中,图片异步加载是一种优化用户体验的关键技术,尤其在处理大量图片或高分辨率图片时。这种技术能够防止应用因为加载图片而变得卡顿或者无响应,提高应用的响应速度和流畅性。本篇文章将深入探讨...
"Android实现ListView异步加载图片" Android 实现 ListView 异步加载图片是一种常见的技术,旨在提高应用程序的性能和用户体验。本文将详细介绍 Android 中实现 ListView 异步加载图片的方法,并对相关的技术概念...
Android 异步加载图片,对ListView的异步加载图片的功能演示,主要根据url读取图片返回流的方法。为了方便演示,将请求图片的链接先固定,每读取好一个图片就更新,界面比较简单,当然你可以做成比较好的,像很多好...
"Android异步加载图片"是一个常见的需求,它涉及到用户体验优化、内存管理以及线程安全等多个方面。这里我们将深入探讨这个主题,并结合提供的"ImageLoader-develop"可能是一个图片加载库的源码,来讲解相关的知识点...
这个库提供了丰富的功能,可以方便地在Android Studio项目中集成,使得图片的异步加载和缓存变得简单高效。 首先,我们要理解为什么需要图片异步加载。在Android设备上,如果直接在主线程中加载图片,尤其是大图或...
以下将详细介绍Android异步加载图片的核心知识点及其重要性。 1. **异步加载原理** - 在Android中,UI线程负责处理用户交互和界面更新,因此不应在该线程执行耗时操作,如网络请求和图片解码。异步加载图片就是将...