WEB开发网
开发学院手机开发Android 开发 Android线程交互(Handler+Thread 和 AsyncTask)... 阅读

Android线程交互(Handler+Thread 和 AsyncTask)

 2010-09-10 00:49:00 来源:WEB开发网   
核心提示:private Handler handler = new Handler() {@Overridepublic void handleMessage(Message msg) {String m = (String) msg.obj;message.setText(m);}};//Task在另外的线程执行,不能直接在

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)

上一页  1 2 3 4 5 6 7 8  下一页

Tags:Android 线程 交互

编辑录入:coldstar [复制链接] [打 印]
赞助商链接