2013-04-11 29 views
0

在我的按鈕,我有以下代碼:我的異步任務不能正常工作,不會調用執行

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"); 

任何ideeas我做錯了什麼?

+0

你可以分享完整的logcat日誌嗎? – 2013-04-11 09:35:48

回答

0

當任何服務在該活動的後臺運行時。例如,當音樂在帶有服務的後臺運行時,Async任務不會在後臺解析XML,因爲它的doInBackground當前不工作,並且進度對話框或progressBar保持旋轉狀態。 這就是爲什麼我使用Executor而不是舊的asynctask。 問題是我有一個下載管理器,它在另一個活動的背景下工作,並從數據庫下載所有本地不存在的視頻。而這與asynctask類一起工作,它不能執行這個。

1

您需要啓動異步任務:

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

而且你不應該叫super.onPostExecute();。這樣做沒有意義。

+0

是的,但這並沒有回答這個問題。 – 2013-04-11 09:33:14

+0

是關於onpostexecute的,但是我的函數是通過ConcatenateVideos類中的setUris函數執行的。它會在一段時間後開始,當下載管理器停下足夠的時間時,讓這個asynctask開始。 – 2013-04-11 12:46:18

0

呼叫按鈕點擊

new ConcatenateVideos().execute() 

方法和從doInBackground()方法內

setUris() 

方法。

+0

我也試過這個,但它不起作用,我在上面創建了一個答案,解釋它爲什麼不起作用,現在它的確如此,因爲我的類現在擴展了ExecutorAsyncTask而不是AsyncTask – 2013-04-11 12:44:35

2

你會看到

"set uris2" 
在日誌輸出

您的後臺任務開始執行之前。無法保證您在從主線程調用​​之後立即開始執行您的方法doInBackground()。它可能會在很短時間後開始執行,但不會立即執行。

也許你只需要在你的logcat緩衝區中進一步尋找你期望的輸出呢?