Glide是否会将每个图像请求排队?Recyclerview在滚动时加载非常缓慢

8

我们的应用程序中使用Glide 3.6和GridLayoutManager的RecyclerView加载图片时,发现图片加载时间非常长。这些图片大小都在20kb-40kb左右。看起来Glide会将所有请求排队,导致一旦您开始向下滚动列表,图片需要相当长的时间才能加载完毕。我已经附上了GenericRequest类的日志。

V/GenericRequest﹕ finished setup for calling load in 0.170291 this: 249721749
V/GenericRequest﹕ finished onSizeReady in 0.36724999999999997 this: 249721749
V/GenericRequest﹕ finished run method in 0.763083 this: 249721749
V/GenericRequest﹕ Got onSizeReady in 0.041249999999999995 this: 991315424
V/GenericRequest﹕ finished setup for calling load in 0.15479199999999999 this: 991315424
V/GenericRequest﹕ finished onSizeReady in 0.30008399999999996 this: 991315424
V/GenericRequest﹕ finished run method in 0.499959 this: 991315424
V/GenericRequest﹕ Got onSizeReady in 0.060584 this: 1029510845
V/GenericRequest﹕ finished setup for calling load in 0.200625 this: 1029510845
V/GenericRequest﹕ finished onSizeReady in 0.39233399999999996 this: 1029510845
V/GenericRequest﹕ finished run method in 0.670084 this: 1029510845
V/GenericRequest﹕ Got onSizeReady in 0.048374999999999994 this: 516458536
V/GenericRequest﹕ finished setup for calling load in 0.188666 this: 516458536
V/GenericRequest﹕ finished onSizeReady in 0.379916 this: 516458536
V/GenericRequest﹕ finished run method in 0.654083 this: 516458536
V/GenericRequest﹕ Resource ready in 1012.49325 size: 2.18359375 fromCache: false this: 671303046
V/GenericRequest﹕ Got onSizeReady in 0.073833 this: 356666200
V/GenericRequest﹕ finished setup for calling load in 0.240667 this: 356666200
V/GenericRequest﹕ finished onSizeReady in 0.460792 this: 356666200
V/GenericRequest﹕ finished run method in 0.780708 this: 356666200
V/GenericRequest﹕ Got onSizeReady in 0.064583 this: 347417463
V/GenericRequest﹕ finished setup for calling load in 0.242583 this: 347417463
V/GenericRequest﹕ finished onSizeReady in 0.45758299999999996 this: 347417463
V/GenericRequest﹕ finished run method in 0.7521249999999999 this: 347417463
V/GenericRequest﹕ Got onSizeReady in 0.142833 this: 671303046
V/GenericRequest﹕ finished setup for calling load in 0.38966599999999996 this: 671303046
V/GenericRequest﹕ finished onSizeReady in 0.703708 this: 671303046
V/GenericRequest﹕ finished run method in 1.851125 this: 671303046
V/GenericRequest﹕ Got onSizeReady in 0.056957999999999995 this: 634418527
V/GenericRequest﹕ finished setup for calling load in 0.21787499999999999 this: 634418527
V/GenericRequest﹕ finished onSizeReady in 0.443083 this: 634418527
V/GenericRequest﹕ finished run method in 0.7567499999999999 this: 634418527
V/GenericRequest﹕ Resource ready in 3443.041335 size: 2.18359375 fromCache: false this: 249721749
V/GenericRequest﹕ Resource ready in 4110.604794 size: 3.8623809814453125 fromCache: false this: 1054166306
V/GenericRequest﹕ Resource ready in 3824.033544 size: 3.8623809814453125 fromCache: false this: 991315424
V/GenericRequest﹕ Resource ready in 3773.0562109999996 size: 3.8623809814453125 fromCache: false this: 1029510845
V/GenericRequest﹕ Resource ready in 4542.90796 size: 2.18359375 fromCache: false this: 516458536
V/GenericRequest﹕ Resource ready in 4171.866168 size: 3.8623809814453125 fromCache: false this: 634418527
V/GenericRequest﹕ Resource ready in 4474.170752 size: 3.8623809814453125 fromCache: false this: 356666200
V/GenericRequest﹕ Resource ready in 4496.104085 size: 2.18359375 fromCache: false this: 671303046
V/GenericRequest﹕ Resource ready in 4814.625126999999 size: 2.18359375 fromCache: false this: 347417463

想知道有没有人能提供一些关于问题可能是什么的见解。也许是调整大小到视图所需的时间?我正在使用match_parent来设置视图的宽度,高度固定约为200dp

图片是使用加载的。

Glide.with(fragmentContext)
          .load(imageUrl)
          .centerCrop()
          .placeholder(R.drawable.placeholder)
          .into(viewHolder.productImage);

XML

<ImageView
      android:id="@+id/product_image"
      android:layout_width="match_parent"
      android:layout_height="@dimen/product_image_height" (208dp)
      android:layout_gravity="top"
      android:background="@color/placeholder_bg"
      />

编辑:根据@VladimirMironov的评论,我已经更新了增加的池并在视图被回收时清除未处理的负载。这似乎在快速滚动时有所帮助。当涉及视图测量时,提供覆盖或不使用“match_parent”对视图有什么好处吗?仍然存在一些情况,其中一个视图几乎要等待5秒才能显示。


4
您可以尝试两种方法来提高性能:
  1. RecyclerView.Adapter.onViewRecycled 中取消下载请求(通过调用 Glide.clear
  2. 通过 recycler.getRecycledViewPool().setMaxRecycledViews(0, 2 * numColumns) 增加 ViewHolder 池的大小。
- Vladimir Mironov
@VladimirMironov 很有趣,我不知道这些,我会试一下。 - IZI_Shadow_IZI
@VladimirMironov 我已经编辑了我的帖子并添加了一些额外的信息。 - IZI_Shadow_IZI
1个回答

1
添加以下代码,您将看到改进。
recyclerView.setHasFixedSize(true);
yourAdapter.setHasStableIds(true);//recycler adapter

重写onViewRecycled()方法并清除之前的Glide请求

Glide.with(imageHolder.preview.getContext()).clear(imageHolder.preview);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接