我有Service
注册ContentObserver
。当我的ContentObserver
检测到更改时,它会将Service的boolean
变量设置为true。我还在服务中运行Thread
,它会休眠一段时间并醒来检查该变量。
当检测到更改时,需要一些时间来处理其他代码,我需要在延迟期间显示ProgressDialog
。我怎么能这样做?
答案 0 :(得分:2)
您应该使用AsyncTask
代替。
Here是图书馆的链接。这很简单:
1)onPreExecute()
=显示ProgressDialog
2)doInBackground()
=执行你的代码
3)onPostExecute()
=解雇ProgressDialog
完成: - )
答案 1 :(得分:2)
您的问题的实质是您希望您的服务向您的UI发送某种消息(以显示加载对话框)。
有四种(或更多)方法可以解决这个问题:
这些选项看起来很熟悉: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。遗憾。