为什么runOnUiThread()在服务中不起作用?

时间:2016-03-11 00:48:00

标签: android android-service

我正在创建一个应用程序,即使应用程序没有运行,也需要每分钟更新一次值。

当然,我已经设置了一个简单的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

4 个答案:

答案 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");
       }
});

根据Android docs

  

警告:服务在其托管进程的主线程中运行 -   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提到的那样,是使用广播 - 换句话说,使用不同的模式。