Handler与Android多线程详解

 更新时间:2013年10月25日 17:16:06   作者:  
一开始,相信很多人都以为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中增加新字库的方法

    Android中增加新字库的方法

    这篇文章主要介绍了Android中增加新字库的方法,本文分别讲解了不需要保留Google默认的中文字库、有需要保留Google默认的中文字库并在此基础上增加自己需要的新字库两种情况下的处理方法,需要的朋友可以参考下
    2015-04-04
  • Android开发设计nowinandroid构建脚本学习

    Android开发设计nowinandroid构建脚本学习

    这篇文章主要为大家介绍了Android开发设计nowinandroid构建脚本学习,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-11-11
  • 基于Android的英文词典的实现方法

    基于Android的英文词典的实现方法

    这篇文章主要为大家详细介绍了基于Android的英文词典的实现方法
    2016-05-05
  • Android实现计步器功能

    Android实现计步器功能

    这篇文章主要为大家详细介绍了Android实现计步器功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-03-03
  • Android Webview使用小结

    Android Webview使用小结

    这篇文章主要针对Android Webview的使用方法为大家进行了详细的总结,感兴趣的小伙伴们可以参考一下
    2016-06-06
  • Android中ImageView用法实例分析

    Android中ImageView用法实例分析

    这篇文章主要介绍了Android中ImageView用法,结合实例形式较为详细的分析了ImageView控件的功能,属性设置与使用相关技巧,需要的朋友可以参考下
    2016-02-02
  • Android手机(设备)连接扫描枪扫码遇到的问题

    Android手机(设备)连接扫描枪扫码遇到的问题

    这篇文章给大家分享了Android手机(设备)连接扫描枪扫码遇到的问题以及解决办法,有需要的参考下。
    2018-07-07
  • Android UI设计之AlertDialog弹窗控件

    Android UI设计之AlertDialog弹窗控件

    这篇文章主要为大家详细介绍了Android UI设计之AlertDialog弹窗控件的使用方法,感兴趣的小伙伴们可以参考一下
    2016-08-08
  • Android操作Excel文件的功能实现

    Android操作Excel文件的功能实现

    本篇文章主要介绍了Android操作Excel文件的功能实现,Android中操作Excel文件导出报表时主要采用开源库jxl,有兴趣的可以了解一下。
    2017-03-03
  • Android中Blade的使用方法

    Android中Blade的使用方法

    这篇文章主要介绍了Android中Blade的使用实例详解,需要的朋友可以参考下
    2018-02-02

最新评论