Android中Handler的使用方法——在子线程中更新界面

本文主要介绍Android的Handler的使用方法。Handler可以发送Messsage和Runnable对象到与其相关联的线程的消息队列。每个Handler对象与创建它的线程相关联,并且每个Handler对象只能与一个线程相关联。

  1. Handler一般有两种用途:1)执行计划任务,你可以再预定的实现执行某些任务,可以模拟定时器。2)线程间通信。在Android的应用启动时,会创建一个主线程,主线程会创建一个消息队列来处理各种消息。当你创建子线程时,你可以再你的子线程中拿到父线程中创建的Handler对象,就可以通过该对象向父线程的消息队列发送消息了。由于Android要求在UI线程中更新界面,因此,可以通过该方法在其它线程中更新界面。

◆ 通过Runnable在子线程中更新界面的例子

  1. ○ 在onCreate中创建Handler

  2. public class HandlerTestApp extends Activity {

            Handler mHandler;

            TextView mText;

            /** Called when the activity is
    first created. */
           @Override

           public void onCreate(Bundle
    savedInstanceState) {

              
    super.onCreate(savedInstanceState);

              
    setContentView(R.layout.main);

               mHandler =
    new Handler();//创建Handler

               mText =
    (TextView) findViewById(R.id.text0);//一个TextView

           }


构建Runnable对象,在runnable中更新界面,此处,我们修改了TextView的文字.此处需要说明的是,Runnable对象可以再主线程中创建,也可以再子线程中创建。我们此处是在子线程中创建的。 

Runnable mRunnable0 = new Runnable()
    {

               
@Override

               
public void run() {

                       
// TODO Auto-generated method stub

                       
mText.setText("This is Update from ohter thread, Mouse DOWN");

               
}
    };

  • ○ 创建子线程,在线程的run函数中,我们向主线程的消息队列发送了一个runnable来更新界面。

    private void updateUIByRunnable(){

              new Thread() 

             { 

                  
    //Message msg = mHandler.obtainMessage(); 

                 
    public void run() 

                 {

    //mText.setText("This is Update from ohter thread, Mouse DOWN");//这句将抛出异常

                      
    mHandler.post(mRunnable0); 

                

             }.start();

    }

    ◆ 用Message在子线程中来更新界面

    1. 用Message更新界面与Runnable更新界面类似,只是需要修改几个地方。

    ○ 实现自己的Handler,对消息进行处理

    private class MyHandler extends Handler
        {

    @Override

            public void handleMessage(Message
    msg) {

                // TODO
    Auto-generated method stub

               
    super.handleMessage(msg);

               
    switch(msg.what)

                {

                case
    UPDATE://在收到消息时,对界面进行更新

                   
    mText.setText("This update by message");

                   
    break;

                }

            }
       
    }

    ○ 在新的线程中发送消息
    private void updateByMessage()

        {
           
    //匿名对象
             new Thread()

             {

                   
    public void run()

                   
    {

                       
    //mText.setText("This is Update from ohter thread, Mouse DOWN");

    //UPDATE是一个自己定义的整数,代表了消息ID

                       
    Message msg = mHandler.obtainMessage(UPDATE);

                       
    mHandler.sendMessage(msg);

                   
    }
             }.start();

        }


  • Android中Handler的使用方法——在子线程中更新界面,布布扣,bubuko.com

    时间: 05-10

    Android中Handler的使用方法——在子线程中更新界面的相关文章

    用Handler的post()方法来传递线程中的代码段到主线程中执行

    自定义的线程中是不能更新UI的,但是如果遇到更新UI的事情,我们可以用handler的post()方法来将更新UI的方法体,直接传送到主线程中,这样就能直接更新UI了.Handler的post()方法就是将Runnable中的代码段传送到主线程. 布局文件就是个textView,我就不贴了. 全部代码 package com.kale.handler; import android.app.Activity; import android.graphics.Color; import andro

    Android--Handler的使用方法:在子线程中更新界面

    本文主要介绍Android的Handler的使用方法.Handler可以发送Messsage和Runnable对象到与其相关联的线程的消息队列.每个Handler对象与创建它的线程相关联,并且每个Handler对象只能与一个线程相关联. Handler一般有两种用途:1)执行计划任务,你可以再预定的实现执行某些任务,可以模拟定时器.2)线程间通信.在Android的应用启动时,会创建一个主线程,主线程会创建一个消息队列来处理各种消息.当你创建子线程时,你可以再你的子线程中拿到父线程中创建的Han

    子线程中CApplication::CreateDispatch失败的解决方法

    问题描述: CApplication appExcel; BOOL bCreateRet = appExcel.CreateDispatch("Excel.Application"); 以上代码在主线程中bCreateRet返回TRUE,在子线程中bCreateRet返回FALSE. 问题原因: 执行线程时没有初始化. 解决办法: 添加初始化函数. AFX_MANAGE_STATE(AfxGetStaticModuleState()); CoInitialize(NULL); AfxE

    android子线程中更新UI的方法

    在Android项目中经常有碰到这样的问题,在子线程中完成耗时操作之后要更新UI,下面就自己经历的一些项目总结一下更新的方法: 参考:Android子线程 方法一:用Handler 1.主线程中定义Handler: Handler mHandler = new Handler() { @Override public void handleMessage(Message msg) { super.handleMessage(msg); switch (msg.what) { case 0: //

    android 不能在子线程中更新ui的讨论和分析

    问题描述 做过android开发基本都遇见过ViewRootImpl$CalledFromWrongThreadException,上网一查,得到结果基本都是只能在主线程中更改ui,子线程要修改ui只能post到主线程或者使用handler之类.但是仔细看看exception的描述并不是这样的,"Only the original thread that created a view hierarchy can touch its views",只有创建该 view 布局层次的原始线程

    使用Handler在子线程中更新UI

    Android规定只能在主线程中更新UI,如果在子线程中更新UI 的话会提示如下错误:Only the original thread that created a view hierachy can touch its view((只有原来的线程创建一个视图层次可以触摸它的视图). 只能在主线程中更新UI的原因是:android中相关的view和控件不是线程安全的,我们必须单独做处理. 有的时候需要再子线程中实现更新UI,下面介绍使用Handler实现线程通信的特点实现在子线程中更新UI. H

    【iOS开发每日小笔记(九)】在子线程中使用runloop,正确操作NSTimer计时的注意点 三种可选方法

    这篇文章是我的[iOS开发每日小笔记]系列中的一片,记录的是今天在开发工作中遇到的,可以用很短的文章或很小的demo演示解释出来的小心得小技巧.它们可能会给用户体验.代码效率得到一些提升,或是之前自己没有接触过的技术,很开心的学到了,放在这里得瑟一下.其实,90%的作用是帮助自己回顾.记忆.复习. 一直想写一篇关于runloop学习有所得的文章,总是没有很好的例子.正巧自己的上线App Store的小游戏<跑酷好基友>(https://itunes.apple.com/us/app/pao-k

    在子线程中使用runloop,正确操作NSTimer计时的注意点 三种可选方法

    游戏中有一个计时功能.在1.0版本中,使用了简单的在主线程中调用: 1 + (NSTimer *)scheduledTimerWithTimeInterval:(NSTimeInterval)ti target:(id)aTarget selector:(SEL)aSelector userInfo:(id)userInfo repeats:(BOOL)yesOrNo; 的方法.但是当每0.01秒进行一次repeat操作时,NSTimer是不准的,严重滞后,而改成0.1秒repeat操作,则这种

    关于Handler的理解,子线程不能更新UI的纠正和回调的思考

    开发Android这么久了,总会听到有人说:主线程不能访问网络,子线程不能更新UI.Android的主线程的确不能长时间阻塞,但是子线程为什么不能更新UI呢?今天把这些东西整理,顺便在子线程更新UI. 首先写了一个handler在子线程更新主线程UI,在子线程做了一个耗时操作:从网络下载了一个图片并利用handler发送到handleMessage()的回调中,并更新到主线程的bitmap.图片显示成功,没有问题.接下来在子线程中更新onCreate()中实例化的textview,报错: and