我正在创建一个应用程序,即使应用程序没有运行,也需要每分钟更新一次值。
当然,我已经设置了一个简单的Service
来做到这一点。我设置了调试消息,告诉我runOnUiThread()
何时启动,何时更新(每分钟)以及何时关闭。我还有一条消息告诉我何时在runOnUiThread()
方法中更新值。除@Override
public void handleMessage(Message message) {
try {
if (!serviceStarted) {
serviceStarted = true;
serviceTest = true;
while (serviceStarted) {
new MainActivity().runOnUiThread(new Runnable() {
public void run() {
OverviewFragment.refresh(getApplicationContext());
System.out.println("yay");
}
});
Thread.sleep(((1 /* minutes */) * 60 * 1000));
System.out.println("Updated values through service.");
}
}
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
e.printStackTrace();
}
stopSelf(message.arg1);
}
中的消息外,我的所有消息都会激活。有什么我做错了(当然有)?我需要改变什么?
代码:
context
答案 0 :(得分:7)
所以除非你在里面创建一个Thread,否则没有必要这样做 它的
Gabe Sechan的回答是正确的。
但是如果你使用的是单独的线程,那么不要使用代码:
new MainActivity().runOnUiThread(new Runnable() {
public void run() {
OverviewFragment.refresh(getApplicationContext());
System.out.println("yay");
}
});
试试,这段代码:
new Handler(Looper.getMainLooper()).post(new Runnable() {
public void run() {
OverviewFragment.refresh(getApplicationContext());
System.out.println("yay");
}
});
警告:服务在其托管进程的主线程中运行 - service不会创建自己的线程,也不会单独运行 过程(除非您另有指定)。
答案 1 :(得分:3)
您无法通过调用new来创建活动。它不会以这种方式正确初始化。
此外,默认情况下,服务在UI线程上运行。所以没有必要这样做,除非你在里面创建一个Thread。如果你是 - runOnUIThread只是用于将runnable发布到处理程序的语法糖。所以你可以这样做。
答案 2 :(得分:2)
尝试使用处理程序或LocalBroadcastManager向活动发送消息。
答案 3 :(得分:0)
请参阅此问题:Accessing UI thread handler from a service
您可以在Looper.getMainLooper()
内使用Handler
发布执行您尝试执行的任何内容的Runnable
。
一个很好的选择,就像jinghong提到的那样,是使用广播 - 换句话说,使用不同的模式。