Handler与Android多线程
2011-09-10 13:05
288 查看
下面是一段大家都比较熟悉的代码:
Handler handler = new Handler();
handler.post(myThread);
//使用匿名内部类创建一个线程myThread
Runnable mythread = new Runnable() {
public void run() {
}
};
一开始,相信很多人都以为myThread中的run()方法会在一个新的线程中运行,但事实并非如此。
上述代码中的handler并没有调用线程myThread的start()方法,而是直接调用了run()方法,这也就意味着实际上并没有创建一个新的线程,只是在当前线程中调用run()方法而已。
这牵扯出一个问题,如果我们将一个很耗时的操作放到了run()方法内,然后使用一个Handler对象将该线程post到线程队列。原本我们希望将这些耗时操作放到另外一个线程中,以免影响当前进程。但实际上却恰恰相反:post()以下的那些代码必须等到run()方法执行完毕后才能继续执行。如当前线程为主线程,那么主程序便会处于硬直状态。
那么应该如何去实现真正的多线程呢?
一种最简便的方法就是直接利用JAVA中的实现多线程的方法,即建立一个Thread对象,然后调用start()方法。
还有另外一种方法,代码如下:
//HandlerThread建立了一个新线程,它包含一个Looper
HandlerThread handlerThread = new HandlerThread("handler_Thread");
handlerThread.start();
//启动一个线程
MyHandler myHandler = new MyHandler(handlerThread.getLooper());
//使用新线程的Looper建立一个Handler
//此时MyHandler便与一个新线程绑定到一起了
Message msg = myHandler.obtainMessage();
msg.sendToTarget();
//将message压入提供message的Handler的消息队列中
//建立一个Handler的子类
class MyHandler extends Handler {
MyHandler(Looper looper) {
super(looper);
}
public void handleMessaage(Message msg) {
//处理消息的代码
}
}
今天我又仔细的看了一下Android文档,发现android虽然支持上两种建立线程的方法,但是它有一个规则:
原文是:it violates the second rule of the single-threaded model: do not access the Android UI toolKit from outside the UI thread.
大概意思就是:Android不支持在UI线程以外的线程中修改UI控件。比如给一个Textview设置文字,这样的操作便不能放在UI线程以外的线程内执行,否则便会出现异常。
关于android多线程,Android还提供了一个AsyncTask类,用来实现多线程。关于这种方法,我将会在下一篇文章中详细说明。
Handler handler = new Handler();
handler.post(myThread);
//使用匿名内部类创建一个线程myThread
Runnable mythread = new Runnable() {
public void run() {
}
};
一开始,相信很多人都以为myThread中的run()方法会在一个新的线程中运行,但事实并非如此。
上述代码中的handler并没有调用线程myThread的start()方法,而是直接调用了run()方法,这也就意味着实际上并没有创建一个新的线程,只是在当前线程中调用run()方法而已。
这牵扯出一个问题,如果我们将一个很耗时的操作放到了run()方法内,然后使用一个Handler对象将该线程post到线程队列。原本我们希望将这些耗时操作放到另外一个线程中,以免影响当前进程。但实际上却恰恰相反:post()以下的那些代码必须等到run()方法执行完毕后才能继续执行。如当前线程为主线程,那么主程序便会处于硬直状态。
那么应该如何去实现真正的多线程呢?
一种最简便的方法就是直接利用JAVA中的实现多线程的方法,即建立一个Thread对象,然后调用start()方法。
还有另外一种方法,代码如下:
//HandlerThread建立了一个新线程,它包含一个Looper
HandlerThread handlerThread = new HandlerThread("handler_Thread");
handlerThread.start();
//启动一个线程
MyHandler myHandler = new MyHandler(handlerThread.getLooper());
//使用新线程的Looper建立一个Handler
//此时MyHandler便与一个新线程绑定到一起了
Message msg = myHandler.obtainMessage();
msg.sendToTarget();
//将message压入提供message的Handler的消息队列中
//建立一个Handler的子类
class MyHandler extends Handler {
MyHandler(Looper looper) {
super(looper);
}
public void handleMessaage(Message msg) {
//处理消息的代码
}
}
今天我又仔细的看了一下Android文档,发现android虽然支持上两种建立线程的方法,但是它有一个规则:
原文是:it violates the second rule of the single-threaded model: do not access the Android UI toolKit from outside the UI thread.
大概意思就是:Android不支持在UI线程以外的线程中修改UI控件。比如给一个Textview设置文字,这样的操作便不能放在UI线程以外的线程内执行,否则便会出现异常。
关于android多线程,Android还提供了一个AsyncTask类,用来实现多线程。关于这种方法,我将会在下一篇文章中详细说明。
相关文章推荐
- Android应用开发基础篇(5)-----Handler与多线程
- Android之旅--Handler与多线程
- 【Android技术整理】Handler以及Handler如何实现多线程
- Android多线程----异步消息处理机制之Handler详解
- Android开发之多线程处理、Handler详解
- android 多线程之Handler和Looper未完成
- Android的多线程——Handler和Async Task学习笔记
- Android——多线程之Handler
- Android--多线程之Handler
- android多线程 : asynctask,thread,handler
- android looper handler 多线程
- Android多线程机制之Handler
- Android 多线程编程:Handler消息传递机制—刷新UI主界面
- Android之多线程工作-AsyncTask与handler
- Android 里面的多线程操作备忘,关于Thread,Handler, Looper
- Android--多线程之Handler
- android多线程编程之AsyncTask与Handler
- Android之多线程通讯handler和Message(一)
- Android——Handler 多线程
- Handler与Android多线程详解