在Android中的主线程上执行代码而无需访问Activity?

Fra*_*osa 24 multithreading android

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

后台线程有时需要在主线程上进行回调.我很难过如何做到这一点.

我无法调用this.runOnUiThread因为"this"是Service的实例,而不是Activity,而Service没有runOnUiThread方法.

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

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

谢谢.

har*_*ism 63

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

new Handler(Looper.getMainLooper()).post(mYourUiThreadRunnable);
Run Code Online (Sandbox Code Playgroud)

  • 我认为它可能已经过时,但仍然在2015年底这是推荐的方式:http://developer.android.com/training/multiple-threads/communicate-ui.html (4认同)

Com*_*are 9

它需要主线程上的回调,以便它可以更新UI元素.

使用LocalBroadcastManager并让服务发送广播,由活动接收,这将在主应用程序线程上获取.这是一个展示这一点的示例应用程序.

或者,使用"真实"广播sendBroadcast().

或者,Messenger如你所提到的那样,使用a ,如HandlerGuillermo所提到的那样,虽然你不一定需要使用绑定.


Sto*_*cea 7

对于科特林:

Handler(Looper.getMainLooper()).post { 
    /*My task*/ 
}
Run Code Online (Sandbox Code Playgroud)


you*_*786 1

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

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

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

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