服務service雖然是在後台執行,但跟activity一樣都在主線程中,如果後台執行著的服務掛起,使用者介面就會卡著不動,俗稱宕機。後台服務經常要做一些耗時操作,比如批量處理、檔案匯入、網路訪問等,此時不應該影響使用者在介面上的操作,而應該開啟分執行緒執行耗時操作。可以通過thread+handler機制實現非同步處理,也可以通過android封裝好的非同步服務intentservice處理。
使用intentservice有兩個好處,乙個是免去複雜的訊息通訊流程;另乙個是處理完成後無須手工停止服務,開發者可集中精力進行業務邏輯的編碼。話雖如此,我們還是有必要了解一下intentservice的具體實現,入了這行一般都要幹上許多年,晚學不如早學。處理器物件位於主線程中,分執行緒通過handler物件通知主線程,然後主線程執行handler物件的handlemessage方法重新整理介面。反過來也是允許的,即處理器物件位於分執行緒中,主線程通過handler物件通知分執行緒,然後分執行緒執行handler物件的handlemessage方法進行耗時處理。
1、建立非同步服務時,初始化分執行緒的handler物件,注意下面原始碼的thread.getlooper方法:
@override
public void oncreate() 2、非同步服務開始執行時,通過handler物件將請求資料送給分執行緒,原始碼如下:
@override
public void onstart(@nullable intent intent, int startid) 3、分執行緒在handler物件的handlemessage方法中,先通過onhandleintent方法執行具體的事務處理,再呼叫stopself結束指定標識的服務。原始碼如下:
private final class servicehandler extends handler
@override
public void handlemessage(message msg)
}了解intentservice的實現思想後,使用過程中需要注意以下4點:
(1)增加乙個構造方法,並分配內部執行緒的唯一名稱。
(2)onstartcommand方法要呼叫父類的onstartcommand,因為父類方法會向分執行緒傳遞訊息。
(3)耗時處理的業務**要寫在onhandleintent方法中,不可寫在onstartcommand方法中。因為onhandleintent方法位於分執行緒,而onstartcommand方法位於主線程。
(4)intentservice實現了onstart方法,卻未實現onbind方法,意味著非同步服務只能用普通方式啟停,不能用繫結方式啟停。
移動開發即服務,騰訊雲移動開發平台打造開發新模式
3.異常崩潰檢測 bugly 為移動開發者提供專業的異常上報和運營統計,幫助開發者快速發現並解決異常,同時掌握產品運營動態,及時跟進使用者反饋。mobileline的最終目的是為移動開發者提供完善的企業級移動開發解決方案,涵蓋從研發構建到上線運營的整個生命週期,後面將會陸續開放實時資料庫 a b t...
非同步服務IntentService
服務service雖然是在後台執行,但跟activity一樣都在主線程中,如果後台執行著的服務掛起,使用者介面就會卡著不動,俗稱宕機。後台服務經常要做一些耗時操作,比如批量處理 檔案匯入 網路訪問等,此時不應該影響使用者在介面上的操作,而應該開啟分執行緒執行耗時操作。可以通過thread handl...
非同步 XML Web 服務方法
有關如何將 web 服務方法轉換為一對為非同步訪問設計的方法的具體步驟說明,請參見如何 建立非同步 web 服務方法。有關其他 示例,請參見如何 將非同步呼叫與 web 服務方法鏈結在一起。總體而言,呼叫執行 i o 操作的方法的 web 服務方法是非同步實現的一種很好的候選方式。這些方法包括 與其...