我的异步任务无法正常工作,不会调用execute

时间:2013-04-11 09:25:45

标签: android multithreading android-asynctask execute runnable

在我的按钮上,我有以下代码:

    Log.i(TAG, "!isFirstVideo: " + isFirstVideo);
ConcatenateVideos concatenateVideos = new ConcatenateVideos();
concatenateVideos.setUris(firstVideoUri, fileUri, VideoRecorderActivity.this);

这是我的asynctask类:

public class ConcatenateVideos extends AsyncTask<String, Void, String> {

private String firstVideoUri, fileUri;
private VideoRecorderActivity videoRecorderActivity;

public void setUris(String firstVideoUri, String fileUri, VideoRecorderActivity videoRecorderActivity) {
    Log.i("VideoRecorderActivity", "set uris");
    this.firstVideoUri = firstVideoUri;
    this.fileUri = fileUri;
    this.videoRecorderActivity = videoRecorderActivity;
    this.execute();
    Log.i("VideoRecorderActivity", "set uris2");
}

@Override
protected String doInBackground(String... params) {
    Log.i("VideoRecorderActivity", "concat do in background");
    FileInputStream videoMain = null, videoToAppend = null;
    try {
        videoMain = new FileInputStream(firstVideoUri);
        videoToAppend = new FileInputStream(fileUri);
    } catch (FileNotFoundException e) {
        Log.i("VideoRecorderActivity", "concat file not found " + e);
        e.printStackTrace();
    }
    if (videoMain != null && videoToAppend != null) {
        concatenateVideos(videoMain, videoToAppend);
        videoRecorderActivity.deleteCancelledRecording(fileUri);
    }
    return null;
}

@Override
protected void onPostExecute(String result) {
    super.onPostExecute(result);
    VideoRecorderActivity.recordButton.setEnabled(true);
    VideoRecorderActivity.okButton.setEnabled(true);
    VideoRecorderActivity.mySurfaceView.setEnabled(true);
    Toast.makeText(videoRecorderActivity, "Video appended succesfully", Toast.LENGTH_SHORT).show();
    Log.i("VideoRecorderActivity", "concat touche enabled record, ok ,surface: " + VideoRecorderActivity.recordButton.isEnabled() + "| " + VideoRecorderActivity.okButton.isEnabled() + "|" + VideoRecorderActivity.mySurfaceView.isEnabled());
}

在logcat中我得到:

04-11 12:21:42.520: I/VideoRecorderActivity(7927): set uris
04-11 12:21:42.520: I/VideoRecorderActivity(7927): set uris2

但是我没有得到Log.i("VideoRecorderActivity", "concat do in background");这是doInBackground类的第一行,被称为这两行:

Log.i("VideoRecorderActivity", "set uris");
this.firstVideoUri = firstVideoUri;
this.fileUri = fileUri;
this.videoRecorderActivity = videoRecorderActivity;
this.execute();
Log.i("VideoRecorderActivity", "set uris2");

任何想法,我做错了什么?

4 个答案:

答案 0 :(得分:2)

你会看到

"set uris2"
在后台任务开始执行之前的日志输出中

。在从主线程调用doInBackground()后,无法保证您的execute()方法将立即开始执行。它可能很快就会开始执行,但不会立即开始执行。

也许您只需要在logcat缓冲区中进一步查找您期望的输出?

答案 1 :(得分:1)

您需要启动异步任务:

ConcatenateVideos concatenateVideos = new ConcatenateVideos();
concatenateVideos.setUris(firstVideoUri, fileUri, VideoRecorderActivity.this);
concatenateVideos.execute();   // let's roll

此外,您不应该致电super.onPostExecute();。这样做没有意义。

答案 2 :(得分:0)

致电

new ConcatenateVideos().execute() 
单击按钮上的

方法

 setUris() 
来自doInBackground()方法的

方法。

答案 3 :(得分:0)

当任何服务在该活动的后台运行时。例如,当音乐在后台运行服务时,Async任务不会在后台解析XML,因为它的doInBackground在那段时间不起作用,并且进度Dialog或progressBar保持旋转。 这就是为什么我使用Executor而不是旧的asynctask。 问题是我有一个下载管理器,它在另一个活动的背景下工作,并从数据库下载所有本地不存在的视频。这与asynctask类一起工作,它无法执行这个。