在ReyclerView中加载大量相同图像的有效方法

时间:2018-10-28 17:55:05

标签: android android-studio android-recyclerview chat picasso

我开发了一个聊天应用程序。它使用RecyclerView显示聊天信息。就像Facebook Messenger一样。

我的问题是,加载要聊天的用户的图像会花费一些时间,并且在有大量聊天消息时会使应用变慢。

我正在使用毕加索来加载图像。

git log --pretty=format:{\"commit\":\"%H\"}
git log --pretty='format:{"commit":"%H"}'

是否有任何有效的方法来显示图像?因为它显示的是同一张图片(用户个人资料图片)。

4 个答案:

答案 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将被回收(重新使用)并且不会一次又一次地加载,结果肯定会更快。