31

我有一个启动和维护后台线程的 Android 服务。

后台线程时不时需要对主线程做回调。我很困惑如何做到这一点。

我不能调用 this.runOnUiThread,因为“this”是 Service 的一个实例,而不是 Activity,而且 Service 没有 runOnUiThread 方法。

我也无法创建或执行 AsyncTask,因为 AsyncTask 的文档说必须从 UI 线程调用构造函数和执行方法。

我是否需要维护对正在使用该服务的活动的引用并调用其 runOnUiThread 方法,或者是否有另一种方法可以在 UI 线程上运行某些东西?

谢谢。

4

5 回答 5

74

如果我不直接访问 Activity(出于某种原因),我会不时使用以下代码;

new Handler(Looper.getMainLooper()).post(mYourUiThreadRunnable);
于 2012-06-25T23:51:09.810 回答
5

对于科特林:

Handler(Looper.getMainLooper()).post { 
    /*My task*/ 
}
于 2020-05-27T09:42:22.483 回答
2

如果您在 Kotlin 中编码,则可以将协程Main调度程序一起使用:

private fun runOnUiThread(block: () -> Unit) {
    CoroutineScope(Dispatchers.Main).launch { block.invoke() }
}

无缘无故的协程应该作为依赖项添加到您的项目中。

于 2020-03-23T13:03:30.507 回答
1

当然。请参阅处理程序。您可以为您的服务提供一个处理程序对象,并且当服务需要在 UI 线程上运行一些可运行任务时,只需调用 handler.post(some_runnable_task)。这个电话。可以在此链接中找到示例4.Tutorial: Handler。

于 2012-06-25T23:49:12.397 回答
1

您的活动必须 可以绑定到服务。

http://developer.android.com/guide/components/bound-services.html

具体来说,看看在该页面上创建一个 Messenger。客户端活动可以提供一个信使对象,该对象响应来自服务的消息,一旦收到,就使用处理程序在 UI 线程上运行任何必要的 UI 代码。

不要在服务中保留活动的引用。这可能导致各种内存问题。

于 2012-06-25T23:43:47.040 回答