0

我的任務是下載一些文件並按順序播放它們。Android的AsyncTask通信媒體播放器

現在我有一個AsynkTask調用服務器,等到服務器生成文件,然後下載它,我這樣做爲n文件。 我的活動中有一個最終的ArrayList,由AsyncTask填充下載文件的路徑。

另一個Asynktask等待(使用迭代的Thread.Sleep()和最大迭代次數)在doInBackground中ArrayList的第一個元素被填充,所以它從doinbackground退出並在postexecute()初始化一個VideoView與這個文件並播放它,其他文件在VideoView的OnCompletation方法中播放。

現在我知道這不是最好的方式來做到這一點,我正在尋找Asynctask之間溝通的另一種方式。我知道在While迭代中使用全局ArrayList和Thread.Sleep()並不好。 我嘗試使用自定義回調函數,但函數代碼需要UIThread,因爲需要啓動VideoView。所以我不能從doinBackground()調用回調函數。

有什麼建議嗎?

回答

1

我不認爲如果asynctask是你的情況的最佳選擇。其中一個缺點是,你不能真正等待一個異類的回調(除非做一個骯髒的破解)。

另一個缺點是,默認情況下asynctasks是連續運行的,所以你不能有一個asynctask等待另一個asynctask的結果(這種行爲可以改變,但我不認爲如果這是你的東西想做)。

清潔解決方案將使用HandlerThread,然後在它們之間發送消息。這些線程將處理給定的消息,或者運行一個Runnable,然後等待,直到他們獲得他們的下一條消息/ Runnable。所以你可以很容易地設置它們之間的通信。

+1

Asynktask可以使用executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR)以並行模式運行。 現在我第一次下載後,解決了使用runOnUiThread,所以我刪除while()和Thread.sleep()。但是現在我看到HandlerThread – tulkas85

+0

是的,您可以使用自定義執行程序使AsyncTask並行運行,這就是爲什麼我說「此行爲可以更改」。但總的來說,如果你認爲你需要多個asyntasks彼此通信,通常HandlerThread是一個更好的選擇。 –