我在一個單獨的類上有一個BroadcastReciever,我在其中一個活動上註冊了接收者,當這個廣播接收者在互聯網連接時觸發。在接收器的onReceive()
裏面,我執行從服務器獲取令牌的方法。在BroadcastReceiver的onReceive裏面調用WebServices是否正確?
但是,當我通過文檔,我發現, 「當它在主線程上運行時,您不應該在其中執行長時間運行的操作(在考慮接收器被阻塞並且候選者被殺死之前,系統允許超時10秒)」
請幫助我正確的做法。
我在一個單獨的類上有一個BroadcastReciever,我在其中一個活動上註冊了接收者,當這個廣播接收者在互聯網連接時觸發。在接收器的onReceive()
裏面,我執行從服務器獲取令牌的方法。在BroadcastReceiver的onReceive裏面調用WebServices是否正確?
但是,當我通過文檔,我發現, 「當它在主線程上運行時,您不應該在其中執行長時間運行的操作(在考慮接收器被阻塞並且候選者被殺死之前,系統允許超時10秒)」
請幫助我正確的做法。
IMO,在廣播接收器的onReceive方法中調用WebService是完全正確的。我在許多應用程序中完成了它,直到現在我從未遇到任何問題。
Infact在大多數需要頻繁更新服務器的應用程序中使用BroadcastReceiver組件,因爲onReceive方法在Worker線程/任務中運行。
爲了安全起見,您可以將您的WebService超時設置爲小於10秒。另一個實現可以是您可以創建後臺/工作線程,從您的BroadcastReceiver的onReceive向其發送一個令牌,並在該線程內你可以調用你的WebService。
不,Android系統可能會殺死您的BroadcastReceiver,以防內存不足。因爲用戶從不或最近不與應用程序進程交互。
當前正在執行BroadcastReceiver的一個進程(也就是說,當前正在其onReceive(Context,Intent)方法中運行代碼)被認爲是前臺進程,並且將由系統保持運行,極端的記憶力。
這意味着一個進程只保存BroadcastReceiver,那麼它可能被認爲是在極端內存壓力情況下的低優先級。
這意味着對於長時間運行的操作,您經常會使用服務與BroadcastReceiver一起使包含進程在整個操作期間保持活動狀態。
Intent intent = new Intent(mContext, MyService.class)
intent.setData(Uri.parse(your_url));
mContext.startService(intent);
創建一個線程,向OnReceive()中的線程發送消息並讓線程處理它。 – GPS
onReceive在後臺任務上運行很好 –