listview优化(中)
优化 listview
2023-09-14 08:58:19 时间
1,对Imageview使用setTag()方法来解决图片错位问题,这个Tag中设置的是图片的url,然后在加载的时候取得这个url和要加载那position中的url对比,如果不相同就加载,相同就是复用以前的就不加载了
2,对于要加载的图片资源,先在内存缓存中找(原始的方法是使用SoftRefrence,最新的方法是使用android提供的Lrucache),如果找不到,则在本地缓存(可以使用DiskLrucache类)中找(也就是读取原先下载过的本地图片),还找不到,就开启异步线程去下载图片,下载以后,保存在本地,内存缓存也保留一份引用
3,在为imagview装载图片时,先测量需要的图片大小,按比例缩放
4,使用一个Map保存异步线程的引用,key- value为url- AsyncTask,这样可以避免已经开启了线程去加载图片,但是还没有加载完时,又重复开启线程去加载图片的情况
5,在快速滑动的时候不加载图片,取消所有图片加载线程,一旦停下来,继续可见图片的加载线程
下面都是我摘取的网上的一些例子,我分别介绍它们来说明上述的优化思路 第一个例子:
// decode这个图片并且按比例缩放以减少内存消耗,虚拟机对每张图片的缓存大小也是有限制的
上面代码的思路是这样的,首先是一个MemoryCache类,用来缓存图片应用到内存。这个类包含一个Collectiosn.synchronizedMap(new LinkedHashMap String,Bitmap (10,1.5f,true))对象,这个对象就是用来保存url和对应的bitmap的,也就是缓存,最后一个参数设置为true的原因,是代表这个map里的元素将按照最近使用次数由少到多排列,即LRU。这样的好处是如果要将缓存中的元素替换,则先遍历出最近最少使用的元素来替换以提高效率 。 另外设置一个缓存的最大值limit,和一个初始值size=0。每次添加图片缓存,Size就增加相应大小,如果增加以后大小超过limit,就遍历LinkedHashMap清楚使用次数最少的缓存,同时减小size值,直到size limit。 作者还举了一个使用SoftReference的例子,这样做的好处是android会自动替我们回收适当的bitmap缓存。 接下来是文件缓存,如果有SD卡则在SD卡中建一个LazyList的目录存放缓存的图片,没有SD卡就放在系统的缓存目录中,将url的hashCode作为缓存的文件名。这个类只是根据url名创建并返回了一个File类,没有真正的缓存图片,图片缓存在ImageLoader类中,不过这个类要获取FileCache返回的File来做FileOutputStream的目的地. 最后是负责的ImageLoader,这个类有一个线程池,用于管理下载线程。另外有一个WeakHashMap ImageView, String 用于保存imageview引用和记录Tag,用于图片更新。它先检查缓存,没有则开启一个线程去下载,下载以后图片保存到缓存(内存,文件),然后缩放图像比例,返回一个合适大小的bitmap,最后开启一个线程去跟新UI(方式是imagview.getContext()获取对应的context,然后context调用runOnUIThread()方法)。 另外,在下载线程开启前,图片下载完成后,跟新UI前,都通过WeakHashMap ImageView, String 获取下载图片的Tag与对应要设置图片imageview的tag比较,防止图片错位。 上述代码完成了基本的优化思路,甚至使用了一个自己定义的缓存类MemoryCache,使管理变得更加清晰,同时有文件缓存,也通过imagview- url的方式避免了图片错位,还开启了异步线程下载图片,但是又开启了一个UI线程去跟新UI。 缺点是开启了UI线程去更新UI,浪费了资源,其实这个可以使用定义一个回调接口实现。另外也没有考虑到重复开启下载线程的问题。
第二个例子: 先贴上主方法的代码:
public Drawable loadDrawable(final String imageUrl, final ImageCallback imageCallback) {
imageCache.put(imageUrl, new SoftReference Drawable (drawable));
以上代码是实现异步获取图片的主方法,SoftReference是软引用,是为了更好的为了系统回收变量,重复的URL直接返回已有的资源,实现回调函数,让数据成功后,更新到UI线程。
几个辅助类文件:
public ImageAndTextListAdapter(Activity activity, List ImageAndText imageAndTexts, ListView listView) {
Drawable cachedImage = asyncImageLoader.loadDrawable(imageUrl, new ImageCallback() {
ImageView imageViewByTag = (ImageView) listView.findViewWithTag(imageUrl);
上篇文章讲到了WebView的基本使用以及Android和js的交互. 这篇文章讲一下WebView遇到的那些坑,带领各位爬坑。这里如果有你没遇到的问题,欢迎留言告诉我,我尽我所能帮你解决。
编程中最难的就是命名?这几招教你快速上手 在项目中,从项目的创建到方法的实现,每一步都以命名为起点,我们需要给变量、方法、参数、类命名,这些名字出现在代码的每个角落,随处可见,混乱或错误的命名不仅让我们对代码难以理解,更糟糕的是,会误导我们的思维,导致对代码的理解完全错误。如果整个项目始终贯穿着好的命名,就能给阅读者一个神清气爽的开始,也能给阅读者一个好的指引。
带你深入React 18源码之:useMemo、useCallback和memo 在这篇文章中,我们将探讨useMemo、useCallback和memo的用法和区别,并通过源码分析来理解它们的工作原理,开整!
阿里云灵积模型服务Quick Start DashScope灵积模型服务以模型为中心,致力于面向AI应用开发者提供品类丰富、数量众多的模型选择,并为其提供开箱即用、能力卓越、成本经济的模型服务API。DashScope灵积模型服务依托达摩院等机构的优质模型,在阿里云基础设施之上构建。灵积服务4.11号刚刚开通公测,目前提供Paraformer语音识别API能力,后续通义千问也将通过该服务对外提供API能力。本文演示如何快速通过Python SDK接入服务。
0基础也能搭建个人网站! 哈喽大家好 ,我是小宇。之前做了一期0成本搭建个人网站的教程,准确来说是0经济成本,反响还不错。但是毕竟是0成本,受限太多,很多小伙伴想学习如何在服务器上搭建网站。正好大学期间,简单的搭建过一些网站,我又做了一些功课,今天小宇就教大家0基础在服务器上搭建属于自己的网站!废话少说,正片开始。
阿里云宣布ECS最新主售实例降价40% 全栈云产品开放免费试用 阿里云宣布ECS最新主售实例降价40% 全栈云产品开放免费试用 阿里云推出对象存储预留空间产品 价格最多降低70%
5,在快速滑动的时候不加载图片,取消所有图片加载线程,一旦停下来,继续可见图片的加载线程
下面都是我摘取的网上的一些例子,我分别介绍它们来说明上述的优化思路 第一个例子:
// decode这个图片并且按比例缩放以减少内存消耗,虚拟机对每张图片的缓存大小也是有限制的
上面代码的思路是这样的,首先是一个MemoryCache类,用来缓存图片应用到内存。这个类包含一个Collectiosn.synchronizedMap(new LinkedHashMap String,Bitmap (10,1.5f,true))对象,这个对象就是用来保存url和对应的bitmap的,也就是缓存,最后一个参数设置为true的原因,是代表这个map里的元素将按照最近使用次数由少到多排列,即LRU。这样的好处是如果要将缓存中的元素替换,则先遍历出最近最少使用的元素来替换以提高效率 。 另外设置一个缓存的最大值limit,和一个初始值size=0。每次添加图片缓存,Size就增加相应大小,如果增加以后大小超过limit,就遍历LinkedHashMap清楚使用次数最少的缓存,同时减小size值,直到size limit。 作者还举了一个使用SoftReference的例子,这样做的好处是android会自动替我们回收适当的bitmap缓存。 接下来是文件缓存,如果有SD卡则在SD卡中建一个LazyList的目录存放缓存的图片,没有SD卡就放在系统的缓存目录中,将url的hashCode作为缓存的文件名。这个类只是根据url名创建并返回了一个File类,没有真正的缓存图片,图片缓存在ImageLoader类中,不过这个类要获取FileCache返回的File来做FileOutputStream的目的地. 最后是负责的ImageLoader,这个类有一个线程池,用于管理下载线程。另外有一个WeakHashMap ImageView, String 用于保存imageview引用和记录Tag,用于图片更新。它先检查缓存,没有则开启一个线程去下载,下载以后图片保存到缓存(内存,文件),然后缩放图像比例,返回一个合适大小的bitmap,最后开启一个线程去跟新UI(方式是imagview.getContext()获取对应的context,然后context调用runOnUIThread()方法)。 另外,在下载线程开启前,图片下载完成后,跟新UI前,都通过WeakHashMap ImageView, String 获取下载图片的Tag与对应要设置图片imageview的tag比较,防止图片错位。 上述代码完成了基本的优化思路,甚至使用了一个自己定义的缓存类MemoryCache,使管理变得更加清晰,同时有文件缓存,也通过imagview- url的方式避免了图片错位,还开启了异步线程下载图片,但是又开启了一个UI线程去跟新UI。 缺点是开启了UI线程去更新UI,浪费了资源,其实这个可以使用定义一个回调接口实现。另外也没有考虑到重复开启下载线程的问题。
第二个例子: 先贴上主方法的代码:
public Drawable loadDrawable(final String imageUrl, final ImageCallback imageCallback) {
imageCache.put(imageUrl, new SoftReference Drawable (drawable));
以上代码是实现异步获取图片的主方法,SoftReference是软引用,是为了更好的为了系统回收变量,重复的URL直接返回已有的资源,实现回调函数,让数据成功后,更新到UI线程。
几个辅助类文件:
public ImageAndTextListAdapter(Activity activity, List ImageAndText imageAndTexts, ListView listView) {
Drawable cachedImage = asyncImageLoader.loadDrawable(imageUrl, new ImageCallback() {
ImageView imageViewByTag = (ImageView) listView.findViewWithTag(imageUrl);
上述代码的思路是这样的:AsyncImageLoader类里面,使用了一个HashMap String, SoftReference Drawable 用来缓存,然后有一个异步下载线程,还有一个方法内部的handler,线程下载完成后,会发消息给handler,然后handler调用回调接口imageCallback的imageLoaded()方法,这个方法是在adapter里面实现的,所以也就是在主线程跟新UI了。
而ViewCache类的作用其实就是ViewHolder,ImageAndText是一个bean类。 在adapter中,使用mageView.setTag(imageUrl)为imageview提供一个唯一标识Url,所以先图片下载完成以后,imageCallback的imageLoaded()方法中,就可以调用listview的findViewWithTag(imageUrl)来找到对应的imageview,从而不用担心错误的问题,这个方法比较巧妙。 缺点是没有实现文件缓存,另外也没有解决出现多个线程下载同一张图片的问题。上篇文章讲到了WebView的基本使用以及Android和js的交互. 这篇文章讲一下WebView遇到的那些坑,带领各位爬坑。这里如果有你没遇到的问题,欢迎留言告诉我,我尽我所能帮你解决。
编程中最难的就是命名?这几招教你快速上手 在项目中,从项目的创建到方法的实现,每一步都以命名为起点,我们需要给变量、方法、参数、类命名,这些名字出现在代码的每个角落,随处可见,混乱或错误的命名不仅让我们对代码难以理解,更糟糕的是,会误导我们的思维,导致对代码的理解完全错误。如果整个项目始终贯穿着好的命名,就能给阅读者一个神清气爽的开始,也能给阅读者一个好的指引。
带你深入React 18源码之:useMemo、useCallback和memo 在这篇文章中,我们将探讨useMemo、useCallback和memo的用法和区别,并通过源码分析来理解它们的工作原理,开整!
阿里云灵积模型服务Quick Start DashScope灵积模型服务以模型为中心,致力于面向AI应用开发者提供品类丰富、数量众多的模型选择,并为其提供开箱即用、能力卓越、成本经济的模型服务API。DashScope灵积模型服务依托达摩院等机构的优质模型,在阿里云基础设施之上构建。灵积服务4.11号刚刚开通公测,目前提供Paraformer语音识别API能力,后续通义千问也将通过该服务对外提供API能力。本文演示如何快速通过Python SDK接入服务。
0基础也能搭建个人网站! 哈喽大家好 ,我是小宇。之前做了一期0成本搭建个人网站的教程,准确来说是0经济成本,反响还不错。但是毕竟是0成本,受限太多,很多小伙伴想学习如何在服务器上搭建网站。正好大学期间,简单的搭建过一些网站,我又做了一些功课,今天小宇就教大家0基础在服务器上搭建属于自己的网站!废话少说,正片开始。
阿里云宣布ECS最新主售实例降价40% 全栈云产品开放免费试用 阿里云宣布ECS最新主售实例降价40% 全栈云产品开放免费试用 阿里云推出对象存储预留空间产品 价格最多降低70%
相关文章
- android使用LruCache对listview加载图片时候优化处理
- ListView优化中的细节问题
- 拿什么守护你-PHP程序级守护进程的实现与优化
- 数据库及SQL优化
- ELK详解(二十三)——elastalert告警优化
- MAT之SA:T1编写主函数法和T2Matlab自带的SA工具箱GUI法,两种方法实现对一元函数优化求解
- Qt中使用openCV修改图片局部颜色算法优化
- 基于ILP的最优PMU放置优化研究(Matlab代码实现)
- 考虑碳交易机制的园区综合能源系统电热协同运行优化研究(Matlab代码实现)
- 基于改进蛙跳优化算法( SFLA) 训练神经网络研究(Matlab代码实现)
- 具有改进均衡优化器的广泛学习极限学习机研究(Matlab代码实现)
- 基于遗传算法和粒子群优化算法优化LSTM(Python代码实现)
- Python实现哈里斯鹰优化算法(HHO)优化Catboost回归模型(CatBoostRegressor算法)项目实战
- Python实现猎人猎物优化算法(HPO)优化支持向量机分类模型(SVC算法)项目实战
- ym——Android之ListView性能优化
- ListView优化中ViewHolder要不要定义为static静态内部类?