2015-09-10 58 views
3

我有這種方法,基本上等待在單身隊列中的項目變空,有一個後臺服務正在運行,服務停止後,它將刪除所有項目隊列和逐一處理。這段代碼在主線程中運行,當我在這裏等待時會發生什麼?警報對話框是否仍然顯示並阻止用戶執行任何其他操作?是否可以阻止UI線程,同時顯示警告對話框

void waitForService() { 
    openConnectionToUploadQueue(); 
    if(answersQueue.getCount(objInterviewQuestion.getQid()) <= 0){ 
     answersQueue.close(); 
     return; 
    } 
    if(!answersQueue.isInterviewUploadServiceRunning()) { 
     answersQueue.startInterviewUploadService(); 
    } 
    AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); 
    builder.setTitle(getString(R.string.auto_submit_alert_title)); 
    builder.setCancelable(false); 
    builder.setMessage(R.string.uploading_pending_answers); 
    AlertDialog waitForServiceDialog = builder.create(); 
    waitForServiceDialog.show(); 
    while (answersQueue.getCount(objInterviewQuestion.getQid()) > 0) { 
     // do nothing and keep loop running till answersQueue is empty 
    } 
    waitForServiceDialog.dismiss(); 
} 
+2

這是一個壞主意,不會阻塞UI線程,而不是有一個回調您關閉與對話。您當前的實施可能會導致崩潰。 – JohanShogun

+0

剛剛意識到調用wait()這裏是愚蠢的編輯問題,以便我對未來的訪問者不會顯得愚蠢> – Bhargav

回答

7

你不應該阻止UI線程。當你持有UI線程時間過長時,系統會顯示一個對話框XXX is not responding,並要求用戶終止你的應用程序。

相反,您應該使用回調樣式調用,並且當服務啓動並且您從回調接收方法調用時,您將關閉對話框。

編輯:

如前所述,你需要實現BroadcastReceiver

這裏是我的其他東西的演示項目,你可以使用它作爲對如何創建和使用BroadcastReceiver樣本。

https://github.com/cyfung/ActivityRecognitionSample

+0

我該如何做到這一點我的服務是以這樣一種方式構建的,即從我的活動中,我將對象推入隊列並忘記他們,我的服務負責上傳他們,並且沒有服務回調。即使我要創建一個回調接口,我該如何將此接口的實現傳遞給該服務? – Bhargav

+0

你只是說你有一個負責上傳的服務。在你的服務中,你應該發送一個'Broadcast',你的Activity應該在接收到的服務運行完成時註冊一個'BroadcastReceiver',你忽略對話框 –

+0

可悲的是這不適合我,因爲服務將被打開和關閉多個時間和大多數時間我不想顯示任何對話框 – Bhargav

相關問題