簡體   English   中英

Android服務,生命周期和線程

[英]Android Service, life cycle and threads

我正在開發服務,該服務擴展了Service類並使用單獨的線程來處理傳入的消息,因此,在onCreate方法中有以下內容

thread = new HandlerThread("MYSERVICE-THREAD",
        Process.THREAD_PRIORITY_BACKGROUND);

thread.start();
serviceLooper = thread.getLooper();
serviceHandler = new ServiceHandler(mServiceLooper);

在此線程中,我創建一個LocationManager並將其設置為偵聽位置更改。 我有點擔心線程的生命周期。 這就是為什么:

如果我沒有在服務的onDestroy方法中從位置管理器中刪除位置偵聽器, 而是通過telnet強制進行位置更新,則一切正常。 我發現這很奇怪,並嘗試在服務的onDestroy方法中以thread.quit()顯式結束線程。 因此,現在從telnet進行位置更新時,首先得到的是我所期望的警告。 處理程序正在死線程上調用處理程序。

從位置管理器中刪除位置偵聽器顯然可以解決此問題,但是,這似乎向我暗示,如果我不顯式關閉線程,則該線程將在服務銷毀后繼續運行。 這個對嗎? 在developer.android.com上的示例中,它們沒有顯式關閉線程,因此我認為VM在這種情況下會處理好它。

哦是的 就是這種情況。 活動也是如此。 除非您自己關閉線程,否則線程將保持打開狀態,直到Android明確殺死它們以釋放資源。 從技術上講,活動和服務從堆棧中彈出時永遠不會關閉。 它只是告訴OS,現在可以在需要時回收他們正在使用的所有資源,因此內存池將成為OS的首要位置。 但是,如果任何類型的線程仍在運行,它將繼續運行(並占用CPU資源),直到回收內存為止(可能在1秒到永恆之間)。

這似乎向我暗示了,如果我不顯式關閉線程,則該線程將在服務銷毀后繼續運行。 這個對嗎?

絕對。 如果分叉線程,則必須對其進行清理。

因此我認為VM在這種情況下會解決它。

好吧,最終它將在操作系統最終終止您應用程序的整個過程的范圍內。 話雖如此,您不想泄漏線程,並且您確實不想泄漏requestLocationUpdates()調用(或您與LocationManager一起使用的任何調用),因為這可以使位置提供程序保持開機狀態(例如,全球定位系統)。

在developer.android.com上的示例中,他們沒有明確關閉線程

您指的是哪些示例?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM