0
我试图从url加载视频缩略图到网格视图中。一切正常,但我收到这条消息“/编舞:跳过了46帧!应用程序可能在其主线程上做了太多工作。”Android:应用程序可能在其主线程上做了太多工作
我知道它与主线程中的缩略图加载有关,但我无法找到如何解决这个问题。
我还在使用一个设备来测试。
public class ThumbAdapter extends ArrayAdapter<Videos> {
Context context;
int ressource;
ThumbAdapter_Holder holder=new ThumbAdapter_Holder();
public ThumbAdapter(Context context, int resource, ArrayList<Videos> videoList) {
super(context, resource, videoList);
this.context=context;
this.ressource=resource;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View view=convertView;
if (view==null){
LayoutInflater inflater = (LayoutInflater) context.getSystemService(context.LAYOUT_INFLATER_SERVICE);
view = inflater.inflate(ressource,parent,false);
holder.video_thum = (ImageView) view.findViewById(R.id.video_thum);
view.setTag(holder);
}
else {
holder=(ThumbAdapter_Holder) view.getTag();
}
try {
holder.video_thum.setImageBitmap(retriveVideoFrameFromVideo(getItem(position).getURL()));
} catch (Throwable throwable) {
throwable.printStackTrace();
}
return view;
}
class ThumbAdapter_Holder{
ImageView video_thum ;
}
public static Bitmap retriveVideoFrameFromVideo(String videoPath) throws Throwable {
Bitmap bitmap = null;
MediaMetadataRetriever mediaMetadataRetriever = null;
try
{
mediaMetadataRetriever = new MediaMetadataRetriever();
if (Build.VERSION.SDK_INT >= 14)
mediaMetadataRetriever.setDataSource(videoPath, new HashMap<String, String>());
else
mediaMetadataRetriever.setDataSource(videoPath);
// mediaMetadataRetriever.setDataSource(videoPath);
bitmap = mediaMetadataRetriever.getFrameAtTime();
}
catch (Exception e)
{
e.printStackTrace();
throw new Throwable(
"Exception in retriveVideoFrameFromVideo(String videoPath)"
+ e.getMessage());
} finally {
if (mediaMetadataRetriever != null) {
mediaMetadataRetriever.release();
}
}
return bitmap;
}
}
很显然,对'mediaMetadataRetriever'的一次调用非常耗时,请考虑将此操作移至工作线程。 – Egor
您可以在https://developer.android.com/reference/android/os/AsyncTask.html中包装整个retrieveVideFrameFromVideo查看如何实施AsyncTask – X3Btel