Android线程交互(Handler+Thread 和 AsyncTask)
2010-09-10 00:49:00 来源:WEB开发网private Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
String m = (String) msg.obj;
message.setText(m);
}
};
//Task在另外的线程执行,不能直接在Task中更新UI,因此创建了Handler
private Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
String m = (String) msg.obj;
message.setText(m);
}
};
当从connect()方法中获得网页内容后,使用如下方法更新界面。
view plaincopy to clipboardprint?
s = new String(baos.toByteArray());
Message mg = Message.obtain();
mg.obj = s;
handler.sendMessage(mg);
s = new String(baos.toByteArray());
Message mg = Message.obtain();
mg.obj = s;
handler.sendMessage(mg);
重新运行NetworkActivity,点击“连接”按钮,结果如图2示,正确读取了网页的内容。
AsyncTask
看上去修改后的connect()方法已经可用了,但是这种匿名程的方式是存在缺陷的:第一,线程的开销较大,如果每个任务都要创建一个线程,那么应用程序的效率要低很多;第二,线程无法管理,匿名线程创建并启动后就不受程序的控制了,如果有很多个请求发送,那么就会启动非常多的线程,系统将不堪重负。另外,前面已经看到,在新线程中更新UI还必须要引入handler,这让代码看上去非常臃肿。
为了解决这一问题,OPhone在1.5版本引入了AsyncTask。AsyncTask的特点是任务在主线程之外运行,而回调方法是在主线程中执行,这就有效地避免了使用Handler带来的麻烦。阅读AsyncTask的源码可知,AsyncTask是使用 java.util.concurrent 框架来管理线程以及任务的执行的,concurrent框架是一个非常成熟,高效的框架,经过了严格的测试。这说明AsyncTask的设计很好的解决了匿名线程存在的问题。
AsyncTask是抽象类,子类必须实现抽象方法doInBackground(Params... p)
更多精彩
赞助商链接