- 浏览: 542954 次
- 性别:
- 来自: 北京
-
文章分类
最新评论
-
tangyunliang:
大哥你太历害了谢谢
Android基于XMPP Smack Openfire开发IM【四】初步实现两个客户端通信 -
u013015029:
LZ,请问下,在// 添加消息到聊天窗口 , 这里获取Ed ...
Android基于XMPP Smack Openfire开发IM【四】初步实现两个客户端通信 -
endual:
怎么保持会话,我搞不懂啊
Android基于XMPP Smack Openfire开发IM【一】登录openfire服务器 -
donala_zq:
显示:[2013-11-30 11:50:36 - Andro ...
android-----------新浪微博 -
donala_zq:
哥,运行不了啊
android-----------新浪微博
http://www.eoeandroid.com/thread-210082-1-1.html
Handler+ExecutorService(线程池)+MessageQueue模式+缓存模式
朋友们,先上效果图:
[img]
[/img]
[img]
[/img]
工程结构图:
[img]
[/img]
RemoteImageView
RemoteAdapter
ImageCache
AsyncDownPicDemoActivity
item_layout.xml
main.xml
AndroidManifest.xml:
Handler+ExecutorService(线程池)+MessageQueue模式+缓存模式
朋友们,先上效果图:
[img]

[/img]
[img]

[/img]
工程结构图:
[img]

[/img]
RemoteImageView
package com.amaker.pic; import android.content.Context; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.drawable.Drawable; import android.os.AsyncTask; import android.util.AttributeSet; import android.widget.ImageView; 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 java.util.concurrent.RejectedExecutionException; /** * ImageView extended class allowing easy downloading * of remote images */ public class RemoteImageView extends ImageView{ public static HashMap<String,Bitmap> imageCache = new HashMap<String, Bitmap>(); private static final int MAX_FAIL_TIME = 5; private int mFails = 0; private String mUrl; //======== private ImageCache mapCache; public RemoteImageView(Context context, AttributeSet attrs) { super(context, attrs); } public void setDefaultImage(int resId){ this.setImageResource(resId); } public void setImageUrl(String url){ if(mUrl != null && mUrl.equals(url)){ mFails++; }else{ mFails = 0; mUrl = url; } if(mFails >= MAX_FAIL_TIME) return; mUrl = url; if(isCached(url)) return; startDownload(url); } public boolean isCached(String url){ if(imageCache.containsKey(url)){ this.setImageBitmap(imageCache.get(url)); return true; } return false; } private void startDownload(String url){ try{ new DownloadTask().execute(url); }catch (RejectedExecutionException e) { //捕获RejectedExecutionException同时加载的图片过多而导致程序崩溃 } } private void reDownload(String url){ setImageUrl(url); } class DownloadTask extends AsyncTask<String, Void, String>{ private String imageUrl; @Override protected String doInBackground(String... params) { imageUrl = params[0]; InputStream is = null; Bitmap bmp = null; try { URL url = new URL(imageUrl); is = url.openStream(); bmp = BitmapFactory.decodeStream(is); if(bmp != null){ imageCache.put(imageUrl, bmp); }else{ reDownload(imageUrl); } } catch (MalformedURLException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally { if(is != null){ try { is.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } return imageUrl; } @Override protected void onPostExecute(String result) { Bitmap bmp = null; if(imageCache.containsKey(result)){ bmp = imageCache.get(result); RemoteImageView.this.setImageBitmap(bmp); }else{ reDownload(imageUrl); } super.onPostExecute(result); } } }
RemoteAdapter
package com.amaker.pic; import android.content.Context; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import java.util.List; public class RemoteAdapter extends BaseAdapter { private Context mContext; private List<String> urls; private LayoutInflater inflater; public RemoteAdapter(Context context,List<String> urls){ mContext = context; this.urls = urls; inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); } @Override public int getCount() { return urls.size(); } @Override public Object getItem(int arg0) { return urls.get(arg0); } @Override public long getItemId(int arg0) { return arg0; } @Override public View getView(int position, View convertView, ViewGroup root) { final ViewHolder holder; if(convertView == null){ convertView = inflater.inflate(R.layout.item_layout, null); holder = new ViewHolder(); holder.imageView = (RemoteImageView)convertView.findViewById(R.id.remote_image_view); convertView.setTag(holder); }else{ holder = (ViewHolder)convertView.getTag(); } holder.imageView.setDefaultImage(R.drawable.default_image); holder.imageView.setImageUrl(urls.get(position)); return convertView; } class ViewHolder{ RemoteImageView imageView; } }
ImageCache
package com.amaker.pic; import java.util.WeakHashMap; import android.graphics.Bitmap; public class ImageCache extends WeakHashMap<String, Bitmap> { private static final long serialVersionUID = 1L; public boolean isCached(String url){ return containsKey(url) && get(url) != null; } }
AsyncDownPicDemoActivity
package com.amaker.pic; import android.app.Activity; import android.content.Context; import android.os.Bundle; import android.widget.GridView; import java.util.Arrays; import java.util.List; public class AsyncDownPicDemoActivity extends Activity { private GridView mGridView; private Context mContext; private List<String> urlList; private RemoteAdapter mRemoteAdapter; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); init(); } private void init(){ mContext = this; mGridView = (GridView)findViewById(R.id.grid_view); urlList = Arrays.asList(new String[]{ "http://www.chinatelecom.com.cn/images/logo_new.gif" ,"http://t03.pic.sogou.com/945b578c3b6057be.jpg" ,"http://t03.pic.sogou.com/3a4feb9c3b6057be.jpg" ,"http://t02.pic.sogou.com/eb95234678ecb28d.jpg" ,"http://t01.pic.sogou.com/a240ade96f0fbe20.jpg" ,"http://t04.pic.sogou.com/e72ead334e356f27.jpg" ,"http://t01.pic.sogou.com/166bb3e4026f1294.jpg" ,"http://t01.pic.sogou.com/bf593d46dc85ff10.jpg" ,"http://t04.pic.sogou.com/a7bedc2a13f3045f.jpg" ,"http://t02.pic.sogou.com/c323b5e10071eed5.jpg" ,"http://www.baidu.com/img/baidu_logo.gif" ,"http://t01.pic.sogou.com/0165d7241d6cd80c.jpg" ,"http://cache.soso.com/30d/img/web/logo.gif", "http://csdnimg.cn/www/images/csdnindex_logo.gif" ,"http://samsung.tgbus.com/UploadFiles_3297/201207/2012071009241894.jpg" ,"http://t01.pic.sogou.com/746bf1a4484d8dd4.jpg" ,"http://www.icoou.com/news_img/20110301/1109150.jpg" ,"http://images.cnblogs.com/logo_small.gif" ,"http://t04.pic.sogou.com/84b8341f7346b9c7.jpg" ,"http://t03.pic.sogou.com/ca11112c3b6057be.jpg" ,"http://t02.pic.sogou.com/56cbda8df459a4e1.jpg" ,"http://t04.pic.sogou.com/64918bba09a4884b.jpg" ,"http://t04.pic.sogou.com/bda625f4bff15e0b.jpg" ,"http://t01.pic.sogou.com/5d9a94e179fb5f08.jpg" ,"http://www.chinatelecom.com.cn/images/logo_new.gif" ,"http://t03.pic.sogou.com/945b578c3b6057be.jpg" ,"http://t03.pic.sogou.com/3a4feb9c3b6057be.jpg" ,"http://t02.pic.sogou.com/eb95234678ecb28d.jpg" ,"http://t01.pic.sogou.com/a240ade96f0fbe20.jpg" ,"http://t04.pic.sogou.com/e72ead334e356f27.jpg" ,"http://t01.pic.sogou.com/166bb3e4026f1294.jpg" ,"http://t01.pic.sogou.com/bf593d46dc85ff10.jpg" ,"http://t04.pic.sogou.com/a7bedc2a13f3045f.jpg" ,"http://t02.pic.sogou.com/c323b5e10071eed5.jpg" ,"http://www.baidu.com/img/baidu_logo.gif" ,"http://t01.pic.sogou.com/0165d7241d6cd80c.jpg" ,"http://cache.soso.com/30d/img/web/logo.gif", "http://csdnimg.cn/www/images/csdnindex_logo.gif" ,"http://samsung.tgbus.com/UploadFiles_3297/201207/2012071009241894.jpg" ,"http://t01.pic.sogou.com/746bf1a4484d8dd4.jpg" ,"http://www.icoou.com/news_img/20110301/1109150.jpg" ,"http://images.cnblogs.com/logo_small.gif" ,"http://t04.pic.sogou.com/84b8341f7346b9c7.jpg" ,"http://t03.pic.sogou.com/ca11112c3b6057be.jpg" ,"http://t02.pic.sogou.com/56cbda8df459a4e1.jpg" ,"http://t04.pic.sogou.com/64918bba09a4884b.jpg" ,"http://t04.pic.sogou.com/bda625f4bff15e0b.jpg" ,"http://t01.pic.sogou.com/5d9a94e179fb5f08.jpg" }); mRemoteAdapter = new RemoteAdapter(mContext, urlList); mGridView.setAdapter(mRemoteAdapter); } }
item_layout.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <com.amaker.pic.RemoteImageView android:id="@+id/remote_image_view" android:layout_width="100dp" android:layout_height="100dp" android:scaleType="fitXY" /> </LinearLayout>
main.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <GridView android:id="@+id/grid_view" android:layout_width="fill_parent" android:layout_height="fill_parent" android:numColumns="3" /> </LinearLayout>
AndroidManifest.xml:
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.amaker.pic" android:versionCode="1" android:versionName="1.0"> <uses-sdk android:minSdkVersion="8" /> <application android:icon="@drawable/icon" android:label="@string/app_name"> <activity android:name="AsyncDownPicDemoActivity" android:label="@string/app_name"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> <uses-permission android:name="android.permission.INTERNET"/> </manifest>
发表评论
-
Android中如何模拟一次点击(touch)事件
2014-05-06 10:41 0在Android中有时需要模拟某一个View的touch事件, ... -
Android程序Crash时的异常上报
2014-04-28 18:15 0http://blog.csdn.net/singwhatiw ... -
android程序中证书签名校验的方法
2014-04-28 17:58 2040android程序中证书签名校验的方法一 2013-02 ... -
MD5理解错了,哎
2014-03-17 14:14 0MD5只对数据加密是无法解密的,也就是说,你把100加密后,就 ... -
Android 获取网络时间
2014-03-12 11:42 2054Android 获取网络时间 在网上看到的最常见的方式有: ... -
SQLite清空表并将自增列归零
2014-03-05 18:02 1580SQLite清空表并将自增列归零 作者:Zhu Yanfeng ... -
Handler小看一下
2013-11-11 16:42 0android handler调用post方法还是阻塞 su ... -
Frame Animation小看一下
2013-10-12 16:30 834Demo运行效果图: 源码: -
动画小学一下
2013-10-12 16:14 764转自: http://www.eoeandroid.com/f ... -
Android 动画之ScaleAnimation应用详解
2013-10-12 15:49 1043===============eoeAndroid社区推荐:= ... -
android开发中的一个工具类
2013-06-19 16:04 0package com.wanpu.login.dialog; ... -
android TextView怎么设置个别字体颜色并换行?
2013-06-20 09:25 1726(1)、TextView 设置个别字体颜色 TextView ... -
Android开发之文件下载,状态时显示下载进度,点击自动安装
2013-05-07 15:38 1476在进行软件升级时,需要进行文件下载,在这里实现自定义的文件下载 ... -
android中的状态保存
2013-04-07 14:21 994package com.zzl.call; import ... -
android动画基础:tween动画
2013-04-06 11:21 1289工程结构图: [img] [/img] 四个动画的xml ... -
面试中遇到的几个问题
2013-06-09 11:56 1048SAX与DOM之间的区别 SAX ( ... -
Android获取其他包的Context实例,然后调用它的方法,反射!!!
2013-03-25 10:32 1239Android中有Context的概念,想必大家都知道。Con ... -
Android的内存机制和常见泄漏情形
2013-03-06 16:55 833一、 Android的内存机制 Android的程序由Ja ... -
JUnit测试小小demo
2013-03-06 16:37 1211运行效果图: [img] [/img] 项目结构图 ... -
android开发中的异常小工具
2013-03-04 15:53 915package com.zzl.tools; impor ...
相关推荐
然后,我们来谈谈图片异步下载。在Android应用中,图片的加载不应阻塞主线程,否则可能导致应用无响应。我们可以使用异步任务(AsyncTask)、Handler/Looper机制或者第三方库如Universal Image Loader、Glide、...
- 第三方库:如Picasso、Glide、Universal Image Loader等,它们提供了便捷的图片异步加载和缓存机制。 4. ** Picasso库的使用** - Picasso是一个强大的图片加载库,支持缓存、内存管理、错误占位符和动画。 - ...
GridView通过适配器(Adapter)与数据源关联,显示数据列表。然而,当数据量大时,一次性加载所有数据可能导致内存压力增大,进而影响应用性能和用户体验。因此,异步加载成为解决这个问题的关键。 异步加载(Async...
ListView GridView ViewPager 异步加载网络图片 +缓存+可配置 万能图片加载器 超级顺畅加载显示 使用简单 教程地址:http://blog.csdn.net/zabio/article/details/19836805
在Android开发中,异步加载网络图片是一项常见的需求,特别是在数据密集型的界面如GridView中。这个Demo展示了如何实现这一功能,同时支持用户点击图片查看大图。以下将详细讲解这个Demo涉及的关键知识点。 首先,...
在Android开发中,...通过以上步骤和技巧,你可以在GridView中实现高效且流畅的网络图片异步加载,从而提升应用的整体用户体验。在实际开发过程中,不断学习和适应新的工具和技术,以适应不断变化的移动开发环境。
总结起来,"gridview异步加载"是一个关于如何在Android的GridView中高效加载和显示图片的技术主题,通过使用像Universal Image Loader、Picasso、Glide或Fresco这样的库,我们可以实现流畅的用户体验,同时避免性能...
总的来说,Android-Universal-Image-Loader为Android开发者提供了一种高效、灵活的图片异步加载解决方案,无论是ListView、GridView还是ViewPager,都可以通过其强大的功能提升用户体验。在实际开发中,掌握这个库的...
在异步加载图片的过程中,我们通常会在doInBackground()方法中下载图片,然后在onPostExecute()方法中将图片显示到GridView的ImageView上。 其次,图片缓存是另一个重要的环节。缓存分为内存缓存和磁盘缓存。内存...
GridView异步加载图片是一项优化用户体验的关键技术,它解决了因图片过大或数量过多导致的UI卡顿问题。本项目"GridView异步加图片载速度很快"(AsyncDownPicDemo)就是针对这个问题提供的一种高效解决方案。 首先,...
本教程将深入探讨如何在Android应用中使用GridView和ViewPager来高效地显示图片,同时解决第一版遗留的第一张图片无法显示和部分机型图片旋转的问题。 1. **GridView与ViewPager介绍** - GridView是Android提供的...
综上所述,解决GridView在显示大量图片时的内存问题,需要从多个方面综合考虑:图片尺寸的预估和调整、异步加载、缓存策略、内存管理以及ListView的复用机制等。只有这样,才能确保在不牺牲用户体验的前提下,有效...
在Android开发中,GridView是一种常见...综上所述,解决GridView加载大量图片卡顿的问题需要结合异步加载技术、高效的缓存策略以及合理的图片处理,通过这些方法,我们能够显著提升用户体验,打造流畅的图片加载效果。
在本教程中,我们将探讨如何在SDK版本1.6的环境中利用GridView来显示图片。 首先,我们需要理解GridView的基本概念。GridView继承自AbsListView,它将数据项按照行和列进行排列,每个数据项都是一个单元格,可以...
在这个“GridView图片单选”的主题中,我们将深入探讨如何实现一个GridView,其中每个单元格显示一张图片,并且用户只能选择一张图片进行单选操作。 首先,我们需要创建一个自定义的GridView适配器(Adapter)。这...
7. **性能优化**:由于横向滚动可能涉及大量视图的创建和销毁,因此需要考虑性能优化,如使用convertView复用机制,避免内存泄漏,以及合理使用异步加载图片等技术。 这个"GridView横向显示实例"项目,通过...
一旦图片加载完成,适配器会更新对应的GridView项,显示图片。 以下是一个简化的流程: 1. GridView的适配器获取到数据源(例如,图片URL列表)。 2. 当用户滚动GridView时,适配器会调用`AsyncImageLoader`加载...
在本案例中,我们关注的是"GridView图片浏览",它允许用户在GridView中查看SD卡上的图片,并且可以点击图片进行放大查看。这个功能在许多应用中都非常实用,比如相册应用或者图片分享平台。 首先,我们需要理解...
综上所述,实现"网络图片的下载并GridView显示"涉及的关键技术包括:使用Volley或其他网络库进行图片下载,处理Android的外部存储权限,自定义Adapter实现GridView的显示,以及异步加载和内存优化。在实际开发中,还...