在Android主线程上执行代码而不访问活动?

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

不时,后台线程需要在主线程上进行callback。 我很难理解如何做到这一点。

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

我也不能创build或执行一个AsyncTask,因为AsyncTask的文档说,构造函数和执行方法都必须从UI线程调用。

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

谢谢。

Solutions Collecting From Web of "在Android主线程上执行代码而不访问活动?"

如果我不持有直接访问活动(由于某种原因),我不时使用以下代码;

new Handler(Looper.getMainLooper()).post(mYourUiThreadRunnable); 

它需要在主线程上进行callback,以便更新UI元素。

使用LocalBroadcastManager并让该服务发送一个广播,由该活动拾取,这将在主应用程序线程上获取它。 这是一个示例应用程序演示这个 。

或者,在sendBroadcast()使用“真正的”广播。

或者像你提到的那样,使用一个Messenger ,像Guillermo提到的那样绑定到一个Handler ,虽然你不一定需要绑定它。

您的活动必须 能够绑定到服务。

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

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

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

当然。 见处理程序 。 你可以给你的服务一个处理程序对象,当服务需要在UI线程上运行一些Runnable任务时,只需要调用handler.post(some_runnable_task)。 这个电话。 可以在这个链接find一个例子4.Tutorial:Handler。