2016-02-22 42 views
0

我一直在使用Google地圖的Android應用程序,然後在後臺運行一些冗長的網絡密集型操作。目前,我正在使用一個線程來運行它們,它們需要30秒到7分鐘才能完成。在觀看關於AstrianTasks和後臺服務的Pluralsight的一些課程後,我現在知道線程理想情況下不應該用於超過幾秒的任何事情。我現在正在改變我的解決方案,使用GPS進行實時運行,而不是花幾分鐘時間來執行這些操作。目標是每更新一次數組OnLocationChanged事件。我應該如何設置我的Android Google地圖應用程序?

我在思考如何在每次OnLocationChanged事件時改變全局數組,同時從UI主線程訪問它時遇到問題。完成此操作的最佳選擇是什麼?我能夠使用進程或AsynTask來完成這個任務嗎?還是需要去客戶端/服務器路由? OnLocationChanged在哪裏被調用?

+0

對不起,但這是絕對錯誤的。在UI線程上運行應儘可能快,以免使應用程序無響應。 AsyncTasks不應該被使用超過幾秒鐘,因爲所有任務共享一個單獨的線程(除非您調用executeOnExecutor,在這種情況下,您可以給它自己的線程)。線程可以根據需要繼續運行,並且應該是長期多任務的主要來源。 –

+0

對不起,我應該澄清,但我的意思是超過200毫秒,應該進入一個線程。我觀看的視頻只是提到任何線程花費超過幾秒鐘的時間都可能會丟失,所以在冗長的情況下使用後臺服務會很明智。如果我打開另一個應用程序並將其放在視圖之外,這些線程一次只能運行幾分鐘仍然安全嗎? – mschmidt9026

+0

是的。當然這並不一定是可怕的。如果你的線程在IO上等待,那沒關係(它在OS中處於暫停狀態並且不會佔用CPU)。如果ts積極解碼這是另一回事。然而,有一些方法可以告訴線程在onPause中暫停或停止,並告訴它在onResume中啓動。 –

回答

1

首先,在UI線程上調用onLocationUpdated。所以你不必擔心那裏的多線程。其次 - 如果你有一個需要被兩個線程觸及的變量,你只需要使用一個信號量,然後在每個線程上訪問它並在完成時釋放它。確保儘可能保持該代碼塊的小而快。有更高級的東西可以滿足高性能需求,但這對於99%的代碼來說已經足夠了。

第三,正如我在評論中提到的,您對線程的理解是錯誤的。 UI線程不應超過需要使用。 AsyncTasks不應該運行超過幾秒鐘(因爲默認情況下它們運行的​​是單個線程,所以長時間運行會阻止其他請求)。但是一個線程只要需要就可以運行,如果需要長期的後臺處理,應該使用線程。

相關問題