在我的按钮上,我有以下代码:
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");
任何想法,我做错了什么?
答案 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类一起工作,它无法执行这个。