从服务访问UI线程处理程序

iLi*_*oid 87 service user-interface multithreading android handler

我在Android上尝试一些新东西,我需要访问UI线程的处理程序.

我知道以下内容:

  1. UI线程有自己的处理程序和循环器
  2. 任何消息都将放入UI线程的消息队列中
  3. looper接收事件并将其传递给处理程序
  4. 处理程序处理消息并将特定事件发送到UI

我希望我的服务必须获取UI线程处理程序并将消息放入此处理程序.这样就可以处理此消息并将其发布到UI.这里的服务将是一个正常的服务,将由一些应用程序启动.

我想知道这是否可行.如果是这样,请建议一些代码片段,以便我可以尝试.

关心Girish

vol*_*ley 175

这段代码构造了与主(UI)线程关联的Handler:

Handler handler = new Handler(Looper.getMainLooper());
Run Code Online (Sandbox Code Playgroud)

然后,您可以在主(UI)线程中发布要执行的内容,如下所示:

handler.post(runnable_to_call_from_main_thread);
Run Code Online (Sandbox Code Playgroud)

如果处理程序本身是从主(UI)线程创建的,则可以省略参数以简化:

Handler handler = new Handler();
Run Code Online (Sandbox Code Playgroud)

关于进程和线程的Android Dev Guide有更多信息.

  • 经过测试,效果很好!用例的一个示例:我有一个Web界面,由直接在设备上运行的服务器提供服务.由于该接口可用于直接与UI交互,并且由于服务器需要在其自己的线程上运行,因此我需要一种方法来从Activity外部触摸UI线程.你所描述的方法效果很好. (2认同)
  • 杰出的。就像一个魅力,非常有用。谢谢你。 (2认同)

Com*_*are 28

创建一个Messenger附加到您的对象Handler并将其传递MessengerService(例如,Intent额外的startService()).然后Service可以发送MessageHandler通过Messenger.这是一个展示这一点的示例应用程序.


use*_*041 5

我建议尝试以下代码:

    new Handler(Looper.getMainLooper()).post(() -> {

        //UI THREAD CODE HERE



    });
Run Code Online (Sandbox Code Playgroud)