为了解决ANR问题,使用新建线程的方式。
但新建的线程无法访问到界面组件。视图组件只对创建视图结构层次的线程开放。而对新建的线程是close的。
解决这个问题可以通过Android的消息队列机制。即通过线程的消息队列处理器(Handler),外部线程向主线程消息发送消息,主线程在收
到消息后,再通过消息的“指示”来控界面。
1)
// 初始化界面线程消息处理器
private final Handler mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
// TODO Auto-generated method stub
super.handleMessage(msg);
// 获取消息数据
Bundle bundle = msg.getData();
String sendStr = bundle.getCharSequence("Sender").toString();
String msgStr = bundle.getString("Msg");
// 输出消息文本框
}
};
2)
将主线程消息处理器传给新建的线程:
private void startServiece()
{
mServerThread = new ServerThread(mHandler);
mServerThread.start();
}
3)
在新建的线程中通过主线程消息处理器给主线程发送消息。
public void showResponse(Handler handler, String sender, String data)
{
//创建消息包
Bundle bundle = new Bundle();
//设置消息项
bundle.putCharSequence("Sender",sender);
bundle.putString("Msg", data);
//创建消息实体
Message msg = new Message();
//设置消息数据
msg.setData(bundle);
handler.sendMessage(msg);
}