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