【问题标题】:Android, Glide shows wrong image for about one secondAndroid,Glide 显示错误图像约一秒钟
【发布时间】:2016-07-07 16:44:14
【问题描述】:

我正在使用 Glide 库从 URL 加载图像,该 URL 是从 Graph Request (Facebook) 获得的。它用于 RecyclerAdapter。当我滚动时,每个 ImageView 显示错误的图片大约不到一秒钟,然后更正一张。代码如下:

@Override
public void onBindViewHolder(final RecyclerView.ViewHolder holder, final int position) {

    ImageView main_image = viewHolder.main_image,

    getEventCover(position, main_image);

        }

private void getEventCover(int position, final ImageView img){

        GraphRequest request = GraphRequest.newGraphPathRequest(
                AccessToken.getCurrentAccessToken(),
                event.get(position).getEventID(),
                new GraphRequest.Callback() {
                    @Override
                    public void onCompleted(GraphResponse response) {

                        JSONObject data = response.getJSONObject();

                        try {
                            JSONObject cover = data.getJSONObject("cover");
                            String source = cover.getString("source");

                            Glide.with(fragment)
                                    .load(source)
                                    .diskCacheStrategy(DiskCacheStrategy.ALL)
                                    .centerCrop()
                                    .into(img);

                        } catch (JSONException e) {
                            e.printStackTrace();
                        }
                    }
                }
        );

        Bundle parameters = new Bundle();
        parameters.putString("fields", "cover");
        request.setParameters(parameters);
        request.executeAsync();
}

【问题讨论】:

  • Glide 异步加载图片。如果您的布局中有默认图像,它将首先显示,然后加载正确的图像。如果是您的情况,请尝试删除布局中的默认图像或将其替换为另一个
  • 感谢您的回复,但我没有在布局中设置默认图像

标签: android android-recyclerview android-glide


【解决方案1】:

您的“问题”是您正在使用的ImageViews 是从之前的行中回收的(滚动时会消失)。因此,onBindViewHolder 中的 ImageView 已经包含以前的图像。

此图像会一直显示,直到对新图像的网络请求(GraphRequest 和 Glide)完成。

为避免此问题,您必须在调用 getEventCover 之前清除您的 ImageView。这可以通过设置占位符图像或设置透明图像来完成,如下所示:

main_image.setImageResource(android.R.color.transparent);

【讨论】:

  • 这还不够。您还必须在调用 setImageResource 之前调用 Glide.clear。否则,在极少数情况下,您会在新请求完成之前看到一个随机的先前请求完成。通常这不是必需的,因为 into() 会做同样的事情,但在这种情况下,你是异步调用 into,所以你仍然需要同步调用 clear
  • @SamJudd 兄弟你是对的,但即使你说的也不起作用,我的意思是图书馆加载图像的速度非常快,它会在显示真实图像之前加载 3-4 个随机图像
【解决方案2】:
@Override
public void onBindViewHolder(final RecyclerView.ViewHolder holder, final int position) {

    ImageView main_image = viewHolder.main_image,
    main_image.setImageURI(null);
    getEventCover(position, main_image);

        }

在(绑定)准备子视图以显示数据的过程中,之前用于显示数据的(回收的)视图正在从缓存中检索以供重用。由于此过程跳过了初始布局膨胀和构造,因此 ImageView 明显保留了它的源。立即将源设置为 null 可显着提高性能。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多