非同步服務IntentService

2021-08-20 06:36:42 字數 1328 閱讀 6392

服務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方法,意味著非同步服務只能用普通方式啟停,不能用繫結方式啟停。

非同步 XML Web 服務方法

有關如何將 web 服務方法轉換為一對為非同步訪問設計的方法的具體步驟說明,請參見如何 建立非同步 web 服務方法。有關其他 示例,請參見如何 將非同步呼叫與 web 服務方法鏈結在一起。總體而言,呼叫執行 i o 操作的方法的 web 服務方法是非同步實現的一種很好的候選方式。這些方法包括 與其...

微服務非同步通訊

在微服務架構中,可能會有幾十甚至上百個微服務。在對外提供的某一項功能中,可能需要同時或依次呼叫這些服務。因此保證微服務之間通訊的穩定性是十分必要的。負載均衡 為了保證服務的可用性,同乙個服務往往會同時部署在多個服務上,為了均衡每個例項的請求壓力,我們需要乙個負載均衡方案。分布式追蹤 服務版本 每當你...

非同步呼叫Web服務

對於某些請求,呼叫webmethod並返回結果的過程需要較長的時間,有時,不能控制從請求資料的web服務,也不能控制這些服務的效能或響應時間,因此,應該考慮非同步使用web服務,發出非同步請求的asp.net應用程式可以在其內部的soap請求等待響應的同時,執行其他程式設計任務,在asp。net應用...