我有一个小问题.需要朝着正确的方向轻推.
我正在做像Vine和/或Instagram的视频编辑器.他们在视频中显示带有屏幕截图的时间线
我正在做像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的