我想把我的函数放在AsyncTask中,但是当我这样做时会导致错误。这是我的代码:
@Override
public void onClick(final View v) {
// TODO Auto-generated method stub
switch (v.getId())
{
case R.id.btnCreateVideo:
{
MP4VideoParams mParams = new MP4VideoParams(v.getContext(), "mnt/sdcard/out.mp4", "MOBILE");
new MyMP4VideoCreator().execute(mParams);
}
break;
default:
{
Toast.makeText(this, "Nothing", Toast.LENGTH_SHORT).show();
}
}
}
我的AsyncTask很简单:
private class MyMP4VideoCreator extends AsyncTask<MP4VideoParams, Void, Void> {
@Override
protected Void doInBackground(MP4VideoParams... MP4Video) {
// TODO Auto-generated method stub
try {
CreateMP4Video.CreateVideo(MP4Video[0].getContext(), MP4Video[0].getOutput(), MP4Video[0].getQuality());
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
}
LogCat:
java.lang.RuntimeException: An error occured while executing doInBackground()
Caused by: java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
这是我第一次使用AsyncTask,请帮帮我。提前谢谢。
答案 0 :(得分:2)
当您尝试直接从工作线程访问UI时,基本上会抛出异常Can't create handler inside thread that has not called Looper.prepare()
。
方法CreateMP4Video.CreateVideo
,是您自己的实现还是任何第三方库?确保您没有尝试直接访问该功能中的UI(例如Toast)。在工作线程内部使用处理程序创建Toasts。
答案 1 :(得分:1)
您正尝试从后台线程访问主线程。
在Asynctask中,doinbackground()方法在后台线程上运行,其中postexecute()在主线程上运行。
所以尝试在onPostexecute中捕获视频,或者你可以在doinbackground()中使用runonUithread()
答案 2 :(得分:0)
我创建了一个Context变量,两个String变量(输出,质量),并在我创建一个MyMP4VideoCreator类时传递这些变量。
我还在创建MP4Video时检查这些功能,并删除属于Toast的所有功能。
幸运的是,它起作用了。非常感谢大家。