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

Android 我的异步任务无法正常工作,未调用execute,android,multithreading,android-asynctask,execute,runnable,Android,Multithreading,Android Asynctask,Execute,Runnable,我的按钮上有以下代码: Log.i(TAG, "!isFirstVideo: " + isFirstVideo); ConcatenateVideos concatenateVideos = new ConcatenateVideos(); concatenateVideos.setUris(firstVideoUri, fileUri, VideoRecorderActivity.this); 这是我的asynctask类: public class ConcatenateVideo

我的按钮上有以下代码:

    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());
}
但是我没有得到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");

知道我做错了什么吗?

您需要启动异步任务:

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

另外,您不应该调用
super.onPostExecute()。这样做没有意义

您需要启动异步任务:

ConcatenateVideos concatenateVideos = new ConcatenateVideos();
concatenateVideos.setUris(firstVideoUri, fileUri, VideoRecorderActivity.this);
concatenateVideos.execute();   // let's roll
另外,您不应该调用
super.onPostExecute()。这样做没有意义

呼叫

new ConcatenateVideos().execute() 
方法单击按钮并单击

 setUris() 
方法。调用

new ConcatenateVideos().execute() 
方法单击按钮并单击

 setUris() 
方法。您将看到

"set uris2"
在后台任务开始执行之前,在日志输出中。无法保证在从主线程调用
execute()
后,您的
doInBackground()
方法将立即开始执行。它可能很快就会开始执行,但不会立即执行

也许您只需要进一步查看logcat缓冲区,以找到您期望的输出?

您将看到

"set uris2"
在后台任务开始执行之前,在日志输出中。无法保证在从主线程调用
execute()
后,您的
doInBackground()
方法将立即开始执行。它可能很快就会开始执行,但不会立即执行


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

当任何服务在后台为该活动运行时。例如,当音乐使用服务在后台运行时,异步任务不会在后台解析XML,因为它的doInBackground在那个时候不工作,并且进度对话框或进度条一直在旋转。 这就是为什么我使用Executor而不是旧的asynctask。
问题是我有一个下载管理器,它在另一个活动的背景下工作,从数据库下载本地不存在的所有视频。如果使用asynctask类,则无法执行此任务。

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

True,但这并不能回答问题。True关于onpostexecute,但我的函数是从ConcatenateVideos类中的setUris函数执行的。它会在一段时间后启动,当下载管理器停止足够的时间后,让这个异步任务启动。为True,但这并没有回答问题。为True,关于onpostexecute,但我的函数是从ConcatenateVideos类中的setUris函数执行的。它会在一段时间后启动,当下载管理器停止足够的时间后,让这个异步任务开始。你能共享完整的logcat日志吗你能共享完整的logcat日志吗?我也尝试过这个,但它不起作用,我在上面创建了一个答案,来解释为什么它不起作用,现在之所以如此,是因为我的类现在扩展了ExecutorAsyncTask而不是AsyncTask。我也尝试过这样做,但不起作用,我在上面创建了一个答案,来解释为什么它不起作用,现在之所以如此,是因为我的类现在扩展了ExecutorAsyncTask而不是AsyncTask