2014-04-26 35 views
-1

我有一個長時間運行的後臺任務,涉及大量計算和磁盤讀取。Android AsyncTask USB調試和standadlone設備運行時間差

當我的nexus 5連接到我的筆記本電腦與USB調試後臺任務的總運行時間約。 7分鐘。

當我單獨在設備上運行它時,沒有連接,它可能需要長達1小時。檢查logcat顯示它正在被阻塞的各種間隔。

我認爲這部分是由於調度,所以我試圖強制使用andorid.os.Process異步任務的優先級,確保它並行使用task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR),我也嘗試使用Java線程,但是我得到了相同的結果。

我錯過了關於USB調試和運行aynctask的東西嗎?如果我開始在手機上運行我的應用程序,然後插入USB以查看logcat,我可能會發現它之前已被阻止,但會以正常速度運行。我的處理相當密集,但我需要儘快完成。有沒有辦法做到這一點?我目前正在使用IntentService進行測試,但希望先獲得一些建議。

所以我的問題是:

有USB調試和單獨在設備上運行時,我的異步任務被封鎖,但不是當它在運行僅在設備上調度方面運行之間的差異裝有USB調試的設備?其次,如何確保我的後臺任務能夠以最少的中斷運行,還是有更好的方法在主線程運行7分鐘的長時間計算任務?

+0

這不是一個android問題。這是一個糟糕的設計的例子。請問一個關於lazyloader的問題。 – danny117

+0

我正在使用一種懶惰的加載程序模式來確保我沒有閒置的對象。當時需要堆上的所有東西,這是一個複雜的圖像處理系統,需要很長的處理時間。我設法使用intentservice來實現這個工作,但我仍然想知道爲什麼當手機插入我的筆記本電腦時沒有計劃問題。我沒有看到你的評論是如何有用的,請閱讀這個問題。 –

回答

0

我認爲這個問題歸功於CPU進入睡眠狀態。

我發現一個帶喚醒鎖的Intentservice可以讓CPU保持關閉狀態。我想也許當USB調試發生CPU不睡覺?

1

我不相信USB調試應該會影響後臺任務的速度。但是,我知道你不應該使用AsyncTasks進行沉重的,長時間運行的網絡或計算。他們不是那個意思。

如文檔

的AsyncTask的設計是圍繞線程和處理程序一個輔助類中提到,並不構成通用線程框架。理想情況下,AsyncTasks應該用於短操作(最多幾秒)。如果您需要保持線程長時間運行,強烈建議您使用java.util.concurrent pacakge提供的各種API,例如執行器,ThreadPoolExecutor和FutureTask。

也許你可以看看使用Service進行長時間運行的操作。服務可以從活動開始,並可以通過廣播接收器進行通信。

+0

謝謝,我現在正在實施一項服務並測試強制startForeground,但似乎我遇到了同樣的問題。當我連接USB時,我可以查看logcat,並且我的代碼正在運行,以便每個單獨的進程以60分鐘的時間運行6000次,大約需要7分鐘才能完成。當我啓動未連接的應用程序時,請等待7分鐘,然後將USB插入logcat中,表明該進程只運行了1000次,之間有很長的間隔。我希望我在這裏缺少一些愚蠢的東西,因爲我需要的是在7分鐘時間內運行不超過1小時! –

+0

這很奇怪,我很想看看你在代碼中做了什麼。有趣的事情正在發生,我當然沒有在Nexus 5上體驗過。 – jmcdonnell40

+0

Galaxy S3上的情況也是如此。代碼只是一個從資源文件夾讀取圖像的循環,然後對圖像進行一些處理以形成81個新圖像,這是完成6000次。我現在用USB調試每個循環需要60ms。當它沒有連接時,循環結束和開始之間可能會有20分鐘的間隙?!必須與阻塞,時間安排和前臺運行有關,我希望這裏有人知道。 –