2012-08-03 65 views
-1

我有Service與註冊ContentObserver。當我的ContentObserver檢測到更改時,它將Service的boolean變量設置爲true。我也有一個Thread運行在睡覺一段時間的服務,並醒來檢查該變量。從服務中的線程顯示ProgressDialog

當它檢測到變化時,它需要一些時間來處理其他代碼,我需要在延遲期間顯示ProgressDialog。我怎樣才能做到這一點?

回答

2

您應該使用AsyncTask代替。

Here是鏈接到圖書館。這是相當簡單:

1)onPreExecute() =顯示ProgressDialog

2)doInBackground() =執行代碼

3)onPostExecute() =駁回ProgressDialog

DONE :-)

+0

但是OP想要從一個服務中做到這一點,所以即使在一個AsyncTask中,他也沒有合適的Context來運行ProgressDialog,對嗎? – 2013-10-08 17:24:47

1

的AsyncTask是一個很好的選擇,但如果你決定使用線程,那麼爲了在UI上顯示ProgressDialog,你需要調用runOnUiThread()活動的方法。

讓假設你想在MainActivity.顯示ProgressDialog裏面的線程服務,你應該有這樣的事情:

MainActivity.this.runOnUiThread(new Runnable() { 
    @Override 
    public void run() { 
     // Display ProgressDialog here 
    } 
}); 
+0

但OP正在嘗試從服務中完成此操作,因此MainActivity.this無法正常工作,對吧? – 2013-10-08 17:23:56

2

你的問題的本質是,你希望你的服務發送的消息某種類型的你的用戶界面(顯示一個加載對話框)。

有四個(或更多)方法中會對此:

  • 意圖:讓服務發送的意圖,你的活動
  • AIDL
  • 使用服務對象本身(如單身)
  • 有您的活動是一個廣播接收器

這些選項可能看起來熟悉:How to have Android Service communicate with Activity

你必須閱讀這些選項並選擇。

1

謝謝大家的解答。 我解決了使用這些步驟 問題 - 廣播意向,當我的變量改爲 - 創建廣播接收器的意圖(在活動) - 廣播接收器的方法的onReceive呼籲runOnUiThread我的活動內

0

我知道這是一個古老的線程但我確切地知道你需要什麼,因爲我在這裏從一個線程實現了這個。請繼續閱讀Rachit米什拉的回答了網頁談論一個進度條:

Communication between Activity and Service

我有這個在我的服務:

public void sendMessage(int state) { 
    Message message = Message.obtain(); 
    switch (state) { 
     case 1://SHOW: 
      message.arg1 = 1; 
      break; 
     case 0: 
      message.arg1 = 0; 
      break; 
    } 
    try { 
     messageHandler.send(message); 
    } catch (RemoteException e) { 
     e.printStackTrace(); 
    } 
} 

呼叫的sendMessage()的1或0,以顯示或駁回ProgressDialog在您的服務中。

這是我的主要活動:

private ProgressDialog progress; 

public class MessageHandler extends Handler { 
    @Override 
    public void handleMessage(Message message) { 
     int state = message.arg1; 
     switch (state) { 
      case 0://HIDE 
       progress.dismiss(); 
       break; 
      case 1://SHOW 
       progress = ProgressDialog.show(MainActivity.this, (getResources().getString(R.string.CONNECTING) + "..."), (getResources().getString(R.string.PLEASE_WAIT) + "!")); //show a progress dialog 
       break; 
     } 
    } 
} 

的ProgressDialog不能從服務中顯示,它必須從活動或片段被調用。我希望我添加了所有你需要的代碼,並且能夠滿足你的需求。說實話,我不知道消息處理程序是如何工作的,但它適用於我!命名可能不是最好的要麼大聲笑。抱歉。