当前位置:  编程技术>移动开发

Handler与Android多线程详解

    来源: 互联网  发布时间:2014-10-21

    本文导语:  下面是一段大家都比较熟悉的代码: 代码如下:Handler handler = new Handler(); handler.post(myThread); //使用匿名内部类创建一个线程myThreadRunnable mythread = new Runnable() {public void run() {}};一开始,相信很多人都以为myThread中的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线程以外的线程内执行,否则便会出现异常。


    
 
 
 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • android开发教程之android的handler使用方法
  • android开发教程之handler异步更新ui
  • Android Handler的详细介绍
  • Android Handler之消息循环的深入解析
  • android Handler详细使用方法实例
  • android的消息处理机制(图文+源码分析)—Looper/Handler/Message
  • java命名空间java.util.logging类handler的类成员方法: handler定义及介绍
  • set_irq_handler 和 set_irq_chained_handler
  • java命名空间javax.xml.ws.handler接口handler<cextendsmessagecontext>成员方法: close定义参考
  • handler的问题,在线急等!!!
  • java命名空间javax.xml.ws.handler枚举messagecontext.scope成员方法: handler定义参考
  • 文件复制软件 Copy Handler
  • java命名空间javax.xml.ws.handler接口handler<cextendsmessagecontext>成员方法: handlefault定义参考
  • 有关signal handler,请教!
  • java命名空间javax.xml.ws.handler接口handler<cextendsmessagecontext>成员方法: handlemessage定义参考
  • exception-handler parameter表示什么?
  • java命名空间java.util.logging类handler的类成员方法: close定义及介绍
  • 函数ts_timers_handler()的疑问
  • java命名空间java.util.logging类handler的类成员方法: seterrormanager定义及介绍
  • CAS Generic Handler
  • java命名空间java.util.logging类handler的类成员方法: getencoding定义及介绍
  • MIPS架构下linux内核中的函数build_tlb_refill_handler()
  • java命名空间java.util.logging类handler的类成员方法: getformatter定义及介绍
  • signal handler 问题
  • java命名空间java.util.logging类handler的类成员方法: getfilter定义及介绍
  • php.ini save_handler 修改不生效的解决办法
  • java命名空间java.util.logging类handler的类成员方法: getlevel定义及介绍
  • Toast和Handler的间隔使用实例


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3