2011-09-02 28 views
4

我一直在寻找相当一段时间来获得一些很好的文档或者一个很好的例子。我需要从后台运行的服务中的工作线程对主要活动UI进行更改。据我所知,我知道我想用某种处理程序工作,但我不确定如何处理这个问题。从服务中的线程对主活动UI进行更改

有没有人有任何想法或好的例子,他们可以指导我?我正在改变的UI元素是一个TextView,它只是通知用户线程的状态。

感谢您的帮助。

回答

7

所有你所要做的就是创建UI线程上Handler

private Handler serviceHandler = new Handler() { 
    @Override 
    public void handleMessage(Message msg) { 
     someFunctionInTheUIThread(); 
    } 
}; 

然后通过你的服务通过此。你可以有一个功能,在服务这样的:

public void registerHandler(Handler serviceHandler) { 
    handler = serviceHandler; 
} 

,然后通过传递处理程序是这样的:

theService = ((LocalBinder) service).getService(); 
theService.registerHandler(serviceHandler); 

然后发回一个消息:

Message msg = handler.obtainMessage(IDENTIFIER, "Message or data"); 
handler.sendMessage(msg); 
+0

如果我从服务中的线程或onStartCommand发送消息,会有关系吗?我计划从两者发送。 – gtdevel

+0

处理程序的美妙之处在于它们跨线程工作 - 请阅读http://developer.android.com/reference/android/os/Handler.html。 “Handler允许你发送和处理与一个线程的MessageQueue相关的Message和Runnable对象,每个Handler实例与一个线程和该线程的消息队列相关联,当你创建一个新的Handler时,它绑定到线程/消息队列创建它的线程 - 从这一点开始,它将向消息队列传递消息和可运行消息,并在消息队列出来时执行它们。“ – Martyn

+0

因此,如果我的服务中有一个工作线程,它不会与服务在同一个线程中运行,是吗?这是否意味着我必须让两个处理程序从服务方法发送消息,然后从该线程发送消息?很抱歉,如果这些是愚蠢的问题,但线程混淆我。 – gtdevel

2

调查服务绑定。或者您可以在主要活动中使用BroadcastReceiver接收来自服务的广播。

1

你有通过sendBroadcast(intent)从您的服务中发送意图,并在您的活动中设置BroadcastReceiver

+0

我试过,但我遇到了一些问题。我会尝试处理程序,然后看看我能否让广播接收机工作... 谢谢。 – gtdevel

1

在主要活动中的onCreate()方法中创建一个处理程序。这将在UI线程中创建一个处理程序。然后使用工作线程中的这个处理程序,调用任何你需要的来获得更新的TextView。