从服务中的线程显示ProgressDialog

时间:2012-08-03 14:17:42

标签: android service progressdialog

我有Service注册ContentObserver。当我的ContentObserver检测到更改时,它会将Service的boolean变量设置为true。我还在服务中运行Thread,它会休眠一段时间并醒来检查该变量。

当检测到更改时,需要一些时间来处理其他代码,我需要在延迟期间显示ProgressDialog。我怎么能这样做?

5 个答案:

答案 0 :(得分:2)

您应该使用AsyncTask代替。

Here是图书馆的链接。这很简单:

1)onPreExecute() =显示ProgressDialog

2)doInBackground() =执行你的代码

3)onPostExecute() =解雇ProgressDialog

完成: - )

答案 1 :(得分:2)

您的问题的实质是您希望您的服务向您的UI发送某种消息(以显示加载对话框)。

有四种(或更多)方法可以解决这个问题:

  • 意图:让您的服务向您的活动发送意图
  • AIDL
  • 使用服务对象本身(作为单身人士)
  • 让您的活动成为广播接收器

这些选项看起来很熟悉:How to have Android Service communicate with Activity

您必须阅读这些选项并选择。

答案 2 :(得分:1)

AsyncTask是一个不错的选择,但如果您决定使用线程,那么为了在UI上显示ProgressDialog,您需要调用活动的runOnUiThread()方法。

假设您想在服务中的MainActivity.线程中显示ProgressDialog,您应该具有以下内容:

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

答案 3 :(得分:1)

谢谢大家的回答。 我使用这些步骤解决了问题    - 当我的变量被更改时广播Intent    - 为intent创建BroadcastReceiver(在Activity中)    - 在BroadcastReceiver的方法onReceive中为我的活动调用runOnUiThread

答案 4 :(得分:0)

我知道这是一个旧线程,但我确切地知道你需要什么因为我刚从这里的一个线程实现了这个。请阅读Rachit Mishra关于ProgressBar的页面后面的答案:

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();
    }
}

使用1或0调用sendMessage()以显示或关闭服务中的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,必须从活动或片段中调用它。我希望我添加了您需要的所有代码,并且它可以很好地满足您的需求。说实话,我不确定消息处理程序是如何工作的,但它对我有用!命名可能不是最好的lol。遗憾。