我开发了一个聊天应用程序。它使用RecyclerView显示聊天信息。就像Facebook Messenger一样。
我的问题是,加载要聊天的用户的图像会花费一些时间,并且在有大量聊天消息时会使应用变慢。
我正在使用毕加索来加载图像。
git log --pretty=format:{\"commit\":\"%H\"}
git log --pretty='format:{"commit":"%H"}'
是否有任何有效的方法来显示图像?因为它显示的是同一张图片(用户个人资料图片)。
答案 0 :(得分:2)
我只能想到您的RecyclerView落后的一个原因。因为您的图像尺寸很大。
看,如果您的聊天图像约为50-100dp,则应使用相同的分辨率图像。也许您正在加载原始图像。
AFAIK我在Picasso上使用Glide,是因为Glide将下载的图像优化为ImageView大小。
请参见Glide doc
Glide的主要重点是滚动任何类型的列表 图像尽可能平滑和快速,但是Glide对 在几乎所有需要获取,调整大小和显示遥控器的情况下 图片。
您不必担心Picasso和Glide两者中的缓存。毕加索默认情况下会启用缓存,因此如果再次查询同一张图片,则会从缓存中选择该图片。
解决方案1(使用Piccaso)
Resize image根据需要。
Picasso
.with(context)
.load(UsageExampleListViewAdapter.eatFoodyImages[0])
.resize(100, 100) // resizes the image to these dimensions (in pixel). does not respect aspect ratio
.into(imageViewResize);
解决方案2(使用Glide)
您无需担心任何事情,如果您使用Glide,那就很好了。
答案 1 :(得分:0)
保持静态 或者您可以在初始化时进行设置 不必每次都在观看者身上更改它
对不起,我的英语和写作格式
答案 2 :(得分:0)
当RecyclerView.OnChildAttachStateChangeListener()
事件表明添加了一个孩子时,您必须推迟第一个图像检索过程。显然,事件是为第一个可见项触发的。推迟此类操作的最正确方法是创建一个处理程序,然后为每个可见对象创建一个send/enqueue
和一个Handler.sendMessage(Message.obtain(..))
。在处理程序内,您将收到该消息,并可以在其中执行毕加索动作。
然后,您必须决定是一次全部加载其他(尚不可见的项目)图像,还是仅在Recycler
要求时才准备图像。
答案 3 :(得分:0)
如果您在同一viewType的所有视图中使用同一图像,则以适配器的onCreateViewHolder
方法而不是onBindViewHolder
加载图像。
已加载图像的同一个View将被回收(重新使用)并且不会一次又一次地加载,结果肯定会更快。