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真的是重新启动一个线程吗?

在handler(二)中点击打开链接,我们说handler是开启了另外一个线程,而且看代码的话确实是这样,实现了runnable接口,这在java中就是开启了一个线程,但是情况中的是这样吗?我们不妨来...

Java中ArrayList类的用法

1、什么是ArrayList ArrayList就是传说中的动态数组,用MSDN中的说法,就是Array的复杂版本,它提供了如下一些好处: 动态的增加和减少元素 实现了ICollectio...

【Android】【bluetooth 】如何记住蓝牙地址名字和状态

在android中,蓝牙的持续状态有两种: on     off,蓝牙的名字和状态是可以改变的,重启手机后,在上层蓝牙如何来记住自己的状态信息呢? 1,关于蓝牙地址: 正常情况下蓝牙地址在使用过程...

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

理解Android 消息机制与Handler和线程的关系,掌握使用方法

Android线程通信机制,handler,looper,messageQueue的关系

Android线程通信机制,handler,looper,messageQueue的关系android应用程序是单线程模型的,(注意,此单线程模型并不是指一个应用程序里只有一个线程,而是说这个程序围绕...

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

package com.example.handler3;import android.app.Activity; import android.os.Bundle; import android.o...

子线程新建Handler为什么会报错?——浅谈Handler、Looper、Message关系

转载注明出处:http://blog.csdn.net/u010181592/article/category/5893483文章出自 我不只是看客的博客很多人都知道不能直接在子线程new 一个Han...

android 线程之间通过Handler发送消息

  • 2017年02月20日 11:44
  • 3.16MB
  • 下载

Android基础之单线程模型中Message、Handler、Message Queue、Looper之间的关系

在单线程模型中Message、Handler、MessageQueue、Looper之间的关系 简单的说,Handler获取当前线程中的looper对象,looper用来从存放Message...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Handler与线程的关系
举报原因:
原因补充:

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