2012-08-03 33 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不能从服务中显示,它必须从活动或片段被调用。我希望我添加了所有你需要的代码,并且能够满足你的需求。说实话,我不知道消息处理程序是如何工作的,但它适用于我!命名可能不是最好的要么大声笑。抱歉。