我有三個AsyncTask:第一個捕獲圖像幀(每秒多於一個)Mat類型,並且應該將它傳遞給第二個AsyncTask。第二個處理框架,如果有必要,它應該傳達第三個AsyncTask來拍攝照片。在AsyncTasks之間交換對象(或消息)已經開始
如何管理已啓動的AsyncTasks之間的通信我的想法是使用靜態對象,但它看起來不像一個「優雅」的解決方案。
PS:如果他們與對象進行通信會更好,但我也接受有關如何傳遞簡單消息的提示。
謝謝
我有三個AsyncTask:第一個捕獲圖像幀(每秒多於一個)Mat類型,並且應該將它傳遞給第二個AsyncTask。第二個處理框架,如果有必要,它應該傳達第三個AsyncTask來拍攝照片。在AsyncTasks之間交換對象(或消息)已經開始
如何管理已啓動的AsyncTasks之間的通信我的想法是使用靜態對象,但它看起來不像一個「優雅」的解決方案。
PS:如果他們與對象進行通信會更好,但我也接受有關如何傳遞簡單消息的提示。
謝謝
你的方法有一些問題,可以證明是難以解決:
1)墊對象在內存和分配時間方面相當昂貴,因此,如果您捕捉每幾幀其次,並在AsyncTask運行時將它們保存在內存中,最終會導致OutOfMemory異常;
2)在一些Android版本上,所有AsyncTasks都運行在同一個線程上,這意味着它們將實際上按順序工作。在最好的情況下,有一個用於運行AsyncTasks的線程池,這意味着您將擁有有限數量的運行任務。
我建議你在onCameraFrame(CvCameraViewFrame inputFrame)
以內完成所有處理。但我想你已經嘗試過了,處理時間很長,以顯示具有足夠FPS的預覽。
要嚴格回答你的問題,你可以使用事件總線通信系統的AsyncTasks。我使用過Otto,它很容易設置,並且有很多例子(http://square.github.io/otto/)。這是使用Otto的一個很好的例子(http://simonvt.net/2014/04/17/asynctask-is-bad-and-you-should-feel-bad/)。只要確保爲每個任務響應創建一個單獨的類文件,或者您將獲得任務消耗對方的消息。
但是,如果你想繼續你的方法,我會建議你使用線程和相互通信。有很多簡單的例子。
感謝您的回覆。目前,圖像分析的整個過程在onCameraFrame(CvCameraViewFrame inputFrame)1.6 FPS(非常低,並且軟件在S4上測試)內執行。這個想法是分開單獨的線程中的各個階段,但我認爲最好的想法是隻使用一個線程獲取照片,並將所有其他內容放在攝像機幀(CvCameraViewFrame inputFrame)上,因爲無論如何,第二個線程與圖像分析)將始終以該速度(1.6 FPS)工作。我的想法是正確的? – BillB
正確的方法是處理onCameraFrame中的所有內容,因爲處理線程必須始終具有當前顯示的幀,而不是1-2秒前拍攝的幀。你可以嘗試微調你的算法以獲得更好的速度。順便說一句,我使用OpenCV和一些邊緣檢測算法,並在S4幀速率是可怕的(1-2 FPS),但在Nexus 4和5的幀速率提高到10 FPS左右。 – andreid
我猜你必須在可以放置消息的任務(信息:發送者,接收者,內容)之間有一些「全局共享空間」,並且每個任務在任務期間讀取這些消息。另一種方法是使用一些回調函數列表(每個任務獲得每個其他任務的回調函數列表)。不確定AsyncTask是否已經提供了某種通信。每種方法都有優點和缺點。此鏈接表示您可以使用'Handler'在任務之間進行通信:http://www.phonesdevelopers.com/1780660/ – Micka