4.11使用活动线程队列和处理程序在线程之间发送消息
问题
您需要将来自服务或其他后台任务的信息或数据传递到活动。因为Activities在UI线程上运行,所以从后台线程调用它们是不安全的。
解
你可以编写一个嵌套类来扩展Android的Handler类;然后覆盖将从线程队列读取消息的handleMessage()方法。通过这个处理程序到工作线程,通常通过工人类的构造函数;在工作线程中,使用各种getsMessage()和sendMessage()方法发布消息。这将导致在handleMessage()方法中调用该活动,但是在事件线程上调用,以便可以安全地更新GUI。
讨论
在许多情况下,您必须有一个线程在后台运行,并将信息发送到主活动的UI线程。在架构级别,您可以采取以下两种方法之一:
•使用Android的AsyncTask类。
•启动新线程。
虽然使用AsyncTask是非常方便,有时你真的需要自己构造一个工作线程。在这种情况下,您可能需要将一些信息发送回活动线程。请记住,Android不允许其他线程修改主UI线程的任何内容。相反,您必须将数据包装到消息中,并通过消息队列发送消息。
为此,您必须首先将Handler类的实例添加到例如MapActivity实例(参见示例4-19)。
实施例4-19。处理程序
现在,在工作线程中,只要你需要将处理程序类实例添加到你的主Activity实例,就可以将消息发送到活动的主队列(见例4-20)。
问题
您需要将来自服务或其他后台任务的信息或数据传递到活动。因为Activities在UI线程上运行,所以从后台线程调用它们是不安全的。
解
你可以编写一个嵌套类来扩展Android的Handler类;然后覆盖将从线程队列读取消息的handleMessage()方法。通过这个处理程序到工作线程,通常通过工人类的构造函数;在工作线程中,使用各种getsMessage()和sendMessage()方法发布消息。这将导致在handleMessage()方法中调用该活动,但是在事件线程上调用,以便可以安全地更新GUI。
讨论
在许多情况下,您必须有一个线程在后台运行,并将信息发送到主活动的UI线程。在架构级别,您可以采取以下两种方法之一:
•使用Android的AsyncTask类。
•启动新线程。
虽然使用AsyncTask是非常方便,有时你真的需要自己构造一个工作线程。在这种情况下,您可能需要将一些信息发送回活动线程。请记住,Android不允许其他线程修改主UI线程的任何内容。相反,您必须将数据包装到消息中,并通过消息队列发送消息。
为此,您必须首先将Handler类的实例添加到例如MapActivity实例(参见示例4-19)。
实施例4-19。处理程序
现在,在工作线程中,只要你需要将处理程序类实例添加到你的主Activity实例,就可以将消息发送到活动的主队列(见例4-20)。
实例4-20。将Runnable发布到队列
/**
* Performs background job
*/
class MyThreadRunner implements Runnable {
// @Override
public void run() {
while (!Thread.currentThread().isInterrupted()) {
// Dummy message -- real implementation
// will put some meaningful data in it
Message msg = Message.obtain();
msg.what = 999;
MyMap.this._handler.sendMessage(msg);
// Dummy code to simulate delay while working with remote server
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
}
}
}