Handler与线程的关系

转载 2015年07月07日 16:19:11

一开始,相信很多人都以为myThread中的run()方法会在一个新的线程中运行,但事实并非如此。以下代码中的handler并没有调用线程myThread的start()方法,而是直接调用了run()方法,这也就意味着实际上并没有创建一个新的线程,只是在当前线程中调用run()方法而已

下面是一段大家都比较熟悉的代码:

复制代码代码如下:

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线程以外的线程内执行,否则便会出现异常。




Handler(原理)创建一个与线程相关的Handler

我们通常在Activity中创建的Handler,是与UI线程绑定的,这里说的绑定其实是指,Looper和MessageQueue的绑定, 而这里的线程,也就是Looper和MessageQueue所...
  • liao277218962
  • liao277218962
  • 2015年09月27日 02:24
  • 960

Handler(原理)创建一个与线程相关的Handler

我们通常在Activity中创建的Handler,是与UI线程绑定的,这里说的绑定其实是指,Looper和MessageQueue的绑定, 而这里的线程,也就是Looper和MessageQueue所...
  • liao277218962
  • liao277218962
  • 2015年09月27日 02:24
  • 960

多线程开发(中)

Thread、Looper与Handler到底啥关系?Handler到底是个啥?有没有自带Handler的Thread?本文将图文并茂向你展示这三者之间的关系,让你优雅的使用Handler做开发。...
  • anddlecn
  • anddlecn
  • 2016年06月08日 15:07
  • 7200

老罗Looper(23)例子讲述Looper与Message,线程和Handler关系

package com.example.handler3;import android.app.Activity; import android.os.Bundle; import android.o...
  • u013225534
  • u013225534
  • 2016年03月18日 23:20
  • 311

子线程中可以使用Handler吗?

本文包括与Handler有关的以下问题:  (1)Handler的作用  (2)为什么Android中要设计为只能在UI线程中去更新UI呢?  (3)Handler的两个异常  (4)Handler、...
  • ErLiangCode
  • ErLiangCode
  • 2016年08月04日 11:41
  • 6615

Android使用Handler实现线程池的效果,实现照片墙应用

转载请注明 http://blog.csdn.net/sinat_30276961/article/details/47296115背景照片墙应用常常被用来讲解Bitmap缓存机制,我觉得这个应用...
  • sinat_30276961
  • sinat_30276961
  • 2015年08月05日 13:52
  • 849

handler底层是如何将消息从子线程发送到主线程

这个问题的实质是handler机制+引用的传递. 理解handler机制有很多方法,我推荐的方法是从四个关键类Handler、Message、MessageQueue、Looper的方法入手来弄清消...
  • jie1991liu
  • jie1991liu
  • 2015年10月12日 14:07
  • 2492

Handler详解系列——利用Handler在主线程与子线程之间互发消息,handler详解

MainActivity如下: package cc.c; import android.app.Activity; import android.os.Bundle; import andr...
  • u011506413
  • u011506413
  • 2016年03月23日 01:19
  • 3097

Android消息机制中Handler切换线程的思考

对Handler通信机制的原理解析
  • Franous
  • Franous
  • 2016年03月24日 21:58
  • 1074

如何在子线程中创建Handler?

也许大家创建Handler都不陌生,但是如果要在子线程创建Handler,大家未必都能正确, 在子线程中创建handler,要确保子线程有Looper,UI线程默认包含Looper 我们需要用到一个特...
  • axuanqq
  • axuanqq
  • 2015年12月24日 17:57
  • 1345
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Handler与线程的关系
举报原因:
原因补充:

(最多只允许输入30个字)