【问题标题】:Vector drawable loading in RecyclerView在 RecyclerView 中加载矢量可绘制对象
【发布时间】:2018-09-07 02:35:16
【问题描述】:

我需要根据不同的情况将 VectorDrawable 资源加载到 recycler-view 中的 imageviews 中。当前的实现每次都会实例化一个新的可绘制对象,我确信这会导致列表中大量项目的性能损失。我想改变它,以便有效地重用可绘制对象以减少创建对象的数量。我正在使用毕加索,我认为将这项工作委托给它可能是个好主意,但看起来毕加索无法加载 VectorDrawable 的。有没有办法解决这个问题?

UPD。 资源使用 ContextCompat.getDrawable 加载并使用 setImageDrawable 设置。 ImageView drawable 在 onViewRecycled 中被清除

【问题讨论】:

  • 显示一些代码来看看你在做什么?
  • @KaveeshKanwal 没有太多代码。资源使用 ContextCompat.getDrawable 加载并使用 setImageDrawable 设置。 ImageView drawable 在 onViewRecycled 中被清除。问题是每次都会调用 ContextCompat.getDrawable 导致对象构造。
  • 我想知道是否有办法在整个应用程序中缓存可绘制对象以供以后使用。

标签: android caching android-recyclerview picasso


【解决方案1】:

我能想到的唯一解决方案是将动态可绘制图像的加载从 UI 线程移动到后台线程。为了使加载更顺畅,您需要使用适配器中的 AsyncTask 异步加载图像。这将减轻 UI 线程的负载并使用户体验更好。您无法使用 Picasso,因此我推荐一个简单的 AsyncTask。

我找到了一个很好的sn-p,看看:

public View getView(int position, View convertView,
        ViewGroup parent) {
    ViewHolder holder;

    ...

    holder.position = position;

    new ThumbnailTask(position, holder)
            .executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, null);

    return convertView;
}

private static class ThumbnailTask extends AsyncTask {
    private int mPosition;
    private ViewHolder mHolder;

    public ThumbnailTask(int position, ViewHolder holder) {
        mPosition = position;
        mHolder = holder;
    }

    @Override
    protected Cursor doInBackground(Void... arg0) {
        // Download bitmap here
    }

    @Override
    protected void onPostExecute(Bitmap bitmap) {
        if (mHolder.position == mPosition) {
            mHolder.thumbnail.setImageBitmap(bitmap);
        }
    }
}

private static class ViewHolder {
    public ImageView thumbnail;
    public int position;
}

欲了解更多信息,请查看this 链接。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-25
    • 2020-10-26
    • 2022-01-27
    相关资源
    最近更新 更多