2013-10-02 106 views
2

正如標題所說,有沒有辦法異步運行BroadcastReceiver onReceive()方法?BroadcastReceiver異步onReceive

根據其實現,android在主線程上運行onReceive()方法。

我正在使用BroadcastReceiver明確請求與USB設備進行通信的權限。當請求權限對話框獲得權限時,將調用onReceive()方法,但由於它在主線程上運行,所以在完成時沒有辦法(至少我不知道)發出信號。輪詢布爾標誌會阻塞主線程,從而阻止onReceive()方法被調用。

是否有異步調用onReceive()的方法,或者是否有其他方式顯式地(不使用清單中的意圖過濾器)請求權限並連接到USB設備?

編輯:我希望它的方法阻塞,直到獲得許可和連接建立。

回答

1

您可以在您的廣播接收器的onReceive中發送廣播。廣播意圖可以在Activity的生命週期方法中註冊,並且可以在相同的情況下注銷。

+0

是的,這是一個解決方案,但(請參閱編輯)我想阻止,直到我有權限。 –

+0

「當請求權限對話框已獲得權限時,將調用onReceive()方法」。當授予權限後,您的接收器是不是收到廣播? –

+0

是的,這是正確的,當獲得許可時,'UsbManager'廣播'PendingIndent'並且接收者調用'onReceive()'並檢查意圖附加項。但是這在主線上運行。 –

0

首先,你不應該在主線程上阻塞任何東西。其次,除非你使用registerReceiver(BroadcastReceiver, IntentFilter, String, Handler),否則你絕對不應該花費很多時間在BroadcastReceiver.onReceive上做任何事情,因爲它很可能會在10秒後被殺死(請參閱documentation for BroadcastReceiver)。您應該從onReceive方法開始AsyncTask或單獨的線程。如果您想在USB設備連接之前停止與其他用戶界面的交互,請不要阻塞主線程。顯式禁用事物或切換到一些簡單的片段或活動與加載GIF或除阻止之外的任何東西。在主線程上阻塞會導致等待或終止系統對話框彈出,並且沒有用戶選擇等待。

您的問題的簡單答案是使用registerReceiver以編程方式註冊接收器,而不是使用清單,但我必須首先提供一些免責聲明。

0

你可以有一個你想要的部分異步行爲。

從Honeycomb開始,您可以撥打goAsync(),然後您有10秒左右的時間來異步完成您的工作。

使用示例可以顯示here

相關問題