Android 系列 4.11使用活动线程队列和处理程序在线程之间发送消息

263 篇文章 2 订阅
164 篇文章 0 订阅
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)。

实例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();
}
}
}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值