Android AsyncTask:执行doInBackground()时出错

时间:2014-07-10 02:52:50

标签: android android-asynctask

我想把我的函数放在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,请帮帮我。提前谢谢。

3 个答案:

答案 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的所有功能。

幸运的是,它起作用了。非常感谢大家。