-1

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

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

4

5 回答 5

2

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

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

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

这些选项可能看起来很熟悉:如何让 Android Service 与 Activity 通信

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

于 2012-08-03T14:33:37.340 回答
2

你应该AsyncTask改用。

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

1) onPreExecute()= 显示ProgressDialog

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

3) onPostExecute()= 解雇ProgressDialog

完毕 :-)

于 2012-08-03T14:26:11.193 回答
1

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

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

MainActivity.this.runOnUiThread(new Runnable() {
    @Override
    public void run() {
        // Display ProgressDialog here
    }
});
于 2012-08-03T14:31:51.873 回答
1

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

于 2012-08-06T15:11:21.180 回答
0

我知道这是一个旧线程,但我正是你需要的,因为我刚刚从这里的一个线程实现了这个。请阅读 Rachit Mishra 在页面下方讨论 ProgressBar 的答案:

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

于 2017-06-21T02:58:29.190 回答