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




举报

相关文章推荐

Android_Handler的使用,巨细,慎入

Handler是啥子,简而言之就是一个用来更新UI的一套机制,和消息处理的机制; 在看代码前,来捋一捋思路。 一般而言,我们常用的Handler的方法主要就有,post,postDelayed,sen...

多线程开发(中)

Thread、Looper与Handler到底啥关系?Handler到底是个啥?有没有自带Handler的Thread?本文将图文并茂向你展示这三者之间的关系,让你优雅的使用Handler做开发。

精选:深入理解 Docker 内部原理及网络配置

网络绝对是任何系统的核心,对于容器而言也是如此。Docker 作为目前最火的轻量级容器技术,有很多令人称道的功能,如 Docker 的镜像管理。然而,Docker的网络一直以来都比较薄弱,所以我们有必要深入了解Docker的网络知识,以满足更高的网络需求。

UI高级------多线程(线程与进程)

一.线程与进程进程与线程的理解: - CPU(工厂)—进程(车间)—-线程(工人):如下图 进程与线程的资源共享: 车间的空间是工人们共享的,比如许多房间是每个工人都可以进出的。这象征 一个...

Handler与looper、MessageQueue的关系

Handler与Looper、MessageQueue的关系 1. Handler机制? 只要遵循Android使用handler来更新UI的机制,我们就不用关心多线程的问题,所有的更新UI的操作...
  • gogmz
  • gogmz
  • 2015-08-11 21:12
  • 403

poj 3304 Segments

Segments Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 14805   Accepted: 4699 ...

java 线程2 线程与进程

线程与进程在操作系统的概念: 进程:一个计算机程序的运行实例,包含了需要执行的指令;有自己的独立地址空间,包含程序内容和数据;不同进程的地址空间是互相隔离的; 进程拥有各种资源和状态信息,包括打开的文...

记录一些数据库事物的头条问题

线程事物的关系

Handler与多线程

Handler与多线程简述 子线程不能更新UI 当我们在子线程中更新UI会导致Android报异常AndroidRuntimeException :“Only the original thread ...

hunnu10522(判断两条线段的交点个数)

搞了n久才AC的,比想象中的要复杂 首先判断是否有交点,然后再有交点的情况下找出有无数个交点的情况,那么剩下一种情况就是1个交点 #include #include #include #inclu...

Android 消息机制与Handler和线程的关系

理解Android 消息机制与Handler和线程的关系,掌握使用方法
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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