android – RecyclerView和async Loading

android – RecyclerView和async Loading,第1张

概述我有一个小问题.需要朝着正确的方向轻推. 我正在做像Vine和/或Instagram的视频编辑器.他们在视频中显示带有屏幕截图的时间线 它只是根据视频持续时间添加更多图片.我为我的应用程序做的是我添加了recyclerView.此recyclerview有一个适配器,每次在onBindViewHolder上调用以下函数 public Bitmap getFrameFromCurrentVideo( 我有一个小问题.需要朝着正确的方向轻推.
我正在做像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 – RecyclerView和async Loading全部内容,希望文章能够帮你解决android – RecyclerView和async Loading所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1130701.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-30
下一篇 2022-05-30

发表评论

登录后才能评论

评论列表(0条)

保存