android – RecyclerView和async Loading

前端之家收集整理的这篇文章主要介绍了android – RecyclerView和async Loading前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个小问题.需要朝着正确的方向轻推.
我正在做像Vine和/或Instagram的视频编辑器.他们在视频中显示带有屏幕截图的时间线

它只是根据视频持续时间添加更多图片.我为我的应用程序做的是我添加了recyclerView.此recyclerview有一个适配器,每次在onBindViewHolder上调用以下函数

public Bitmap getFrameFromCurrentVideo(int seconds) {
    Bitmap bitmap = null;
    if(mMediaMetadataRetriever != null) {
      bitmap = mMediaMetadataRetriever.getFrameAtTime(seconds * 1000000,MediaMetadataRetriever.OPTION_CLOSEST);
    }
    return bitmap;
  }

这是有效的,它添加了我想要的适当数量的图像.但问题是它在UI线程上太沉重了.由于recyclerView回收所有东西.它每次必须得到一个帧时就会滞后.

所以我认为我必须做一些异步任务,然后缓存图像.但我读到的是,AsyncTask不建议用于回收站视图,因为它可以循环使用.

那么我应该怎样做才能提高性能呢?有什么好主意吗?

解决方法

这就是我为解决问题所做的工作.
我创建了异步任务和内存缓存我的结果.

我的适配器检查图像是否已存在.如果是的话.然后我们跳过做后台工作.否则我执行异步任务并尝试加载图像.我们还标记视图,以防用户在任务未完成时滚动.

这有助于我们检查标签是否与任务具有不同.如果它是相同的.然后我们可以安全地将正确​​的图像放在imageview中.

来自我的适配器的片段

@Override
  public void onBindViewHolder(PostVideoRecyclerViewHolder holder,int position) {
    holder.mImageView.getLayoutParams().width = mScreenWidth / mMaxItemsOnScreen;
    holder.mImageView.setImageDrawable(null);
    int second = position * 3 - 3;
    String TAG = String.valueOf(second);
    holder.mImageView.setTag(TAG);

    Bitmap bitmap = mFragment.getBitmapFromMemCache(TAG);
    if(bitmap == null) {
      PostVideoBitmapWorkerTask task = new PostVideoBitmapWorkerTask(holder.mImageView,TAG,mFragment);
      task.execute(second);
    }
    else {
      holder.mImageView.setImageBitmap(bitmap);
    }
  }

我的AsyncTask类

public class PostVideoBitmapWorkerTask extends AsyncTask<Integer,Void,Bitmap> {
  private ImageView mImageView;
  private String TAG;
  private PostVideoFeedFragment mFragment;

  public PostVideoBitmapWorkerTask(ImageView imageView,String TAG,PostVideoFeedFragment fragment) {
    mImageView = imageView;
    this.TAG = TAG;
    mFragment = fragment;
  }

  @Override
  protected Bitmap doInBackground(Integer... params) {
    Bitmap bitmap = mFragment.getFrameFromCurrentVideo(params[0]);
    mFragment.addBitmapToCache(TAG,bitmap);
    return bitmap;
  }

  @Override
  protected void onPostExecute(Bitmap bitmap) {
    if(mImageView.getTag().toString().equals(TAG)) {
      mImageView.setImageBitmap(bitmap);
    }
  }
}

我的片段类的片段

public void addBitmapToCache(String key,Bitmap bitmap) {
    if (getBitmapFromMemCache(key) == null) {
      mMemoryCache.put(key,bitmap);
    }
  }

  public Bitmap getBitmapFromMemCache(String key) {
    return mMemoryCache.get(key);
  }

如果你想阅读缓存,我可以推荐https://developer.android.com/training/displaying-bitmaps/cache-bitmap.html

还有https://developer.android.com/reference/android/os/AsyncTask.html用于读取asyncTask的

猜你在找的Android相关文章