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

    时间: 2024-12-15 01:52:13

    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--Handler的用法:在子线程中更新界面

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

    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的3种方法

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

    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

    Android开发之在子线程中更新UI

    转自第一行代码-Android Android是不允许在子线程中进行UI操作的.在子线程中去执行耗时操作,然后根据任务的执行结果来更新相应的UI控件,需要用到Android提供的异步消息处理机制. 代码如下: 1 public class MainActivity extends Activity implements OnClickListener { 2 private static final int UPDATE_TEXT=1; 3 private TextView textView;