我正在做像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所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)