Android 从服务内的线程显示ProgressDialog

Android 从服务内的线程显示ProgressDialog,android,service,progressdialog,Android,Service,Progressdialog,我有一个注册了ContentObserver的服务。当myContentObserver检测到更改时,它会将服务的boolean变量设置为true。我还有一个线程在服务中运行,它会休眠一段时间,然后醒来检查该变量 当它检测到更改时,它需要一些时间来处理一些其他代码,我需要在延迟期间显示ProgressDialog。我该怎么做呢?您应该改用AsyncTask 是图书馆的链接。这相当简单: 1) onPreExecute()=showProgressDialog 2) doInBackground(

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


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

您应该改用
AsyncTask

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

1)
onPreExecute()
=show
ProgressDialog

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

3)
onPostExecute()
=解除
ProgressDialog


完成:-)

异步任务是一个很好的选择,但是如果您决定使用线程,那么为了在UI上显示ProgressDialog,您需要调用活动的
runOnUiThread()
方法

假设您想在
main活动中显示ProgressDialog。
在您的服务线程中,您应该有如下内容:

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

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

有四种(或更多)方法可以做到这一点:

  • 意图:让您的服务向您的活动发送意图
  • 艾德尔
  • 使用服务对象本身(作为单例)
  • 让你的活动成为一个广播接收器
这些选项似乎很熟悉:


你必须仔细阅读这些选项,然后自己选择。

谢谢大家的回答。 我使用以下步骤解决问题 -更改变量时的广播意图 -为意图创建广播接收器(在活动中)
-在BroadcastReceiver的方法onReceive call runOnUiThread中,我的活动

我知道这是一个旧线程,但我有您所需要的,因为我刚刚从这里的一个线程实现了它。请进一步阅读Rachit Mishra关于进度条的回答:

我有以下服务:

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。对不起。

但是OP试图从服务中执行此操作,所以MainActivity。这不起作用,对吗?但是OP希望从服务中执行此操作,所以即使在异步任务中,他也没有适当的上下文来运行ProgressDialog,对吗?