我有一个Service
已注册的ContentObserver
. 当我ContentObserver
检测到更改时,它会将 Service 的boolean
变量设置为 true。我还在Thread
服务中运行了一段时间,然后醒来检查该变量。
当它检测到更改时,它需要一些时间来处理其他一些代码,我需要ProgressDialog
在延迟期间显示。我怎样才能做到这一点?
我有一个Service
已注册的ContentObserver
. 当我ContentObserver
检测到更改时,它会将 Service 的boolean
变量设置为 true。我还在Thread
服务中运行了一段时间,然后醒来检查该变量。
当它检测到更改时,它需要一些时间来处理其他一些代码,我需要ProgressDialog
在延迟期间显示。我怎样才能做到这一点?
您问题的本质是您希望您的服务向您的 UI 发送某种消息(以显示加载对话框)。
有四种(或更多)方法可以解决这个问题:
这些选项可能看起来很熟悉:如何让 Android Service 与 Activity 通信
您必须阅读这些选项并进行选择。
你应该AsyncTask
改用。
这是图书馆的链接。这很简单:
1) onPreExecute()
= 显示ProgressDialog
2) doInBackground()
= 执行你的代码
3) onPostExecute()
= 解雇ProgressDialog
完毕 :-)
AsyncTask 是一个不错的选择,但如果您决定使用线程,那么为了在 UI 上显示 ProgressDialog,您将需要调用runOnUiThread()
活动的方法。
假设您想在MainActivity.
Service 的内部线程中显示 ProgressDialog,您应该具有以下内容:
MainActivity.this.runOnUiThread(new Runnable() {
@Override
public void run() {
// Display ProgressDialog here
}
});
谢谢大家的回答。我使用这些步骤解决了问题 - 当我的变量发生更改时广播 Intent - 为意图创建 BroadcastReceiver(在 Activity 中) - 在 BroadcastReceiver 的方法 onReceive 中为我的活动调用 runOnUiThread
我知道这是一个旧线程,但我正是你需要的,因为我刚刚从这里的一个线程实现了这个。请阅读 Rachit Mishra 在页面下方讨论 ProgressBar 的答案:
我的服务中有这个:
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 不能从服务中显示,它必须从活动或片段中调用。我希望我添加了您需要的所有代码,并且它可以很好地满足您的需求。老实说,我不确定消息处理程序是如何工作的,但它对我有用!命名可能也不是最好的,哈哈。对不起。