廣播中等待較久出現anr問題

2022-07-17 05:27:08 字數 1092 閱讀 7631

需要實現乙個開機時刻啟動公升級服務的功能,但是接受的廣播為android的"android.intent.action.boot_completed",接收到廣播後,系統的網路並不一定就緒,在網路不通的情況下可能導致本次公升級服務啟動不了。

解決方法是,在接收到廣播之後查詢網路狀況,如果網路通暢,則啟動公升級服務,否則等待150s,直到網路通暢再啟動公升級。

該方法成功的解決了收到開機廣播和網路就緒不同步問題,保證公升級服務在有線連線和wifi連線情況下都能夠順利啟動。

需要注意的一點是,等待操作不能直接加入到廣播接受的reveiver函式中,這樣,如果等待時間較久,一般超過十秒鐘,會報anr錯誤。

e/activitymanager( 2029): anr in com.tcl.mtk.mtkversionupdate

e/activitymanager( 2029): pid: 2810

e/activitymanager( 2029): reason: broadcast of intent

e/activitymanager( 2029): load: 4.17 / 0.97 / 0.32

**實現片段:

@override

public void onreceive(context context, intent intent)

}class autonetworkupdatethread extends thread else

try catch (interruptedexception e1)

log.d(tag,"the " + attempttime + " time attempt...." );

if (attempttime == maxconnecttime - 1)

attempttime++;}}

}}對於adsl的鏈結又比較特殊,因為這種連線先是有線的以太連線上,然後才自動撥號。這個時候根據網路是否通暢來判斷就會出錯,http連線就會超時。

針對該情況給http連線加了重複嘗試機制。完美解決。其實對於上述wifi問題,也不需要在開啟服務之前嘗試,可以統一放至http處嘗試。因為上述解決還存在一點問題:kill了程序後將不會從onreceive發起,錯過嘗試機會。

Linux中等待佇列機制分析

linux中等待佇列機制分析 在軟體開發中任務經常由於某種條件沒有得到滿足而不得不進入睡眠狀態,然後等待條件得到滿足的時候再繼續執行,進入執行狀態。這種需求需要等待佇列機制的支援。linux 中提供了等待佇列的機制,該機制在核心中應用很廣泛。在linux 核心中使用等待佇列的過程很簡單,首先定義乙個...

Linux中等待佇列機制分析

在軟體開發中任務經常由於某種條件沒有得到滿足而不得不進入睡眠狀態,然後等待條件得到滿足的時候再繼續執行,進入執行狀態。這種需求需要等待佇列機制的支援。linux 中提供了等待佇列的機制,該機制在核心中應用很廣泛。在linux 核心中使用等待佇列的過程很簡單,首先定義乙個wait queue head...

Linux中等待佇列的實現

linux中等待佇列的實現 在軟體開發中任務經常由於某種條件沒有得到滿足而不得不進入睡眠狀態,然後等待條件得到滿足的時候再繼續執行,進入執行狀態。這種需求需要等待佇列機制的支援。linux 中提供了等待佇列的機制,該機制在核心中應用很廣泛。在linux 核心中使用等待佇列的過程很簡單,首先定義乙個 ...