`
chen592969029
  • 浏览: 109964 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

Android Handler

 
阅读更多

 当应用程序启动,创建了一个叫“main”的线程,用于管理UI相关,又叫UI线程。其他线程叫工作线程(Work Thread)。

Single Thread Model

 

  • 一个组件的创建并不会新建一个线程,他们的创建都在UI线程中进行,包括他们的回调方法,如onKeyDown()
  • 当在UI线程中进行某些耗时的操作时,将会阻塞UI线程,一般阻塞超过5秒就会显示一个ANR对话框。
  • UI线程是非线程安全的,所以,不能在工作线程中操作UI元素。

     

    两个原则

    • Do not block the UI thread (不要阻塞UI线程)
    • Do not access the Android UI toolkit from outside the UI thread (不要在工作线程中操作UI元素)

     

    在工作线程更新UI方法

    • Activity.runOnUiThread(Runnable)
    • Handler
      • sendMessage(Message)
      • post(Runnable)
    • AsyncTask
      • execute()
      • doInBackground()
      • onPostExecute()

     

    例子程序

    • HandlerActivity01
      • 在工作线程中进行UI操作。
    • HandlerActivity02
      • Handler的两个重要方法:sendMessagepost
    • HandlerActivity03
      • 官方推荐最佳方法。

     

    HandlerActivity01主要代码:

            btnEnd.setOnClickListener(new View.OnClickListener() {
                
                @Override
                public void onClick(View v) {
                    new Thread(new Runnable() {
    
                        @Override
                        public void run()
                        {
                            //在新建的线程(工作线程)中改变Button的文字
                            btnEnd.setText("Text Changed in Sub Thread");
                        }
                        
                    }).start();
                }
            });

     

     这是一种错误的做法,运行程序,会报错误:

    android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views. 
    
    

     

     

     

     

     HandlerActivity02主要代码:

    public class HandlerActivity02 extends Activity
    {
    
        private int title = 0;
        Button btnStart,btnEnd;
    
        private Handler mHandler = new Handler()
        {
            public void handleMessage(Message msg)
            {
                //更新UI
                switch (msg.what)
                {
                    case 1:
                        updateTitle();
                        break;
                }
            };
        };
        
        public void onCreate(Bundle savedInstanceState)
        {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
            
            btnStart = (Button)findViewById(R.id.start);
            btnEnd = (Button)findViewById(R.id.end);
            //新启动一个线程,进行耗时操作
            Timer timer = new Timer();
            //每六秒执行一次MyTask的run方法
            timer.scheduleAtFixedRate(new MyTask(this), 1, 6000);
        }
    
        private class MyTask extends TimerTask
        {
            private Activity context;
            MyTask(Activity context)
            {
                this.context = context;
            }
            
            @Override
            public void run()
            {
                //耗时操作略.... 
                
                //更新UI方法  1
                Message message = new Message();
                message.what = 1;
                mHandler.sendMessage(message);
                
                //更新UI方法  2
                mHandler.post(updateThread);
                
                //更新UI方法  3
                context.runOnUiThread(updateThread);
            }
        }
    
        public void updateTitle()
        {
            setTitle("Welcome to Mr Wei's blog " + title);
            title++;
        }
        
        Runnable updateThread = new Runnable() 
        {
    
            @Override
            public void run()
            {
                //更新UI
                btnStart.setText(String.valueOf(title));
                btnEnd.setText(String.valueOf(title));
            }
            
        };
    }

     这里有个容易出错的地方,在更新UI方法2和3中,我们传入的参数是一个Runnable对象,一般认为这就会启动一个新的线程,而且常有人在这个Runnable对象的run方法中进行耗时操作。看过这块的源码就会知道,其实,android只是调用了这个Runnable对象的run方法而已,并没有启动新的线程,而且我们不应该在run方法中进行耗时操作,因为这个run方法最终是在UI线程里面执行的。也就是说,run方法里面只应该放更新UI的代码,handleMessage方法也一样。

     

    如果你要看这部分源代码的话,相信这个图对你会有帮助:

     

     

    HandlerActivity03主要代码:

    public class HandlerActivity03 extends Activity
    {
        Button btnStart;
        @Override
        protected void onCreate(Bundle savedInstanceState)
        {
            // TODO Auto-generated method stub
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
            
            btnStart = (Button)findViewById(R.id.start);
            btnStart.setOnClickListener(new View.OnClickListener() {
                
                @Override
                public void onClick(View v) {
                    //开始执行AsyncTask,并传入某些数据
                    new LongTimeTask().execute("New Text");
                }
            });
        }
        
        private class LongTimeTask extends AsyncTask<String, Void , String>
        {
    
            @Override
            protected String doInBackground(String... params)
            {
                try
                {
                    //线程睡眠5秒,模拟耗时操作,这里面的内容Android系统会自动为你启动一个新的线程执行
                    Thread.sleep(5000);
                }
                catch (InterruptedException e)
                {
                    e.printStackTrace();
                }
                return params[0];
            }
    
            @Override
            protected void onPostExecute(String result)
            {
                //更新UI的操作,这里面的内容是在UI线程里面执行的
                btnStart.setText(result);
            }
            
        }
    
    }

     

     这个方法确实挺好,因为它为你封装了许多操作,你只需要记住在doInBackground方法中写耗时操作的代码,在onPostExecute方法中写更新UI的方法就行了。

 

  • 大小: 37.5 KB
分享到:
评论
2 楼 llbest1 2012-08-22  
写得非常好。
1 楼 luhuajcdd 2012-06-03  

相关推荐

    模拟Android Handler机制Demo

    【Android Handler机制】是Android应用程序中用于线程间通信的核心组件,它与Looper和Message紧密配合,实现消息的发送、处理以及线程间的同步。在Android应用开发中,尤其是涉及到UI更新时,Handler机制显得尤为...

    Android Handler传值的demo

    在Android开发中,`Handler`、`Message`和`Looper`是实现线程间通信的重要机制,特别是当需要在主线程(UI线程)和工作线程之间传递数据时。本示例“Android Handler传值的demo”将帮助我们深入理解这一机制。 `...

    androidHandler测试的demo

    在“androidHandler测试的demo”中,我们可以预期包含以下内容: 1. 创建自定义`Handler`子类:这个子类可能重写了`handleMessage(Message msg)`方法,根据`msg.what`的值执行不同的操作,比如更新UI元素或执行特定...

    Android Handler消息处理顺序分析

    在Android开发中,Handler、Looper和Message是实现线程间通信的重要组件,它们共同构建了Android的消息处理机制。本文将详细分析Android Handler消息处理的顺序,以及如何利用这些组件进行异步操作。 首先,理解...

    老罗android Handler综合练习 图文混排 服务器端源代码

    【标题】"老罗android Handler综合练习 图文混排 服务器端源代码"涉及的是Android应用开发中的关键知识点,主要集中在Handler机制、图文混排以及服务器端的数据交互。Handler是Android系统中用于线程间通信的重要...

    Android Handler模拟进度条更新

    由于Android的单线程模型,直接在后台线程更新UI是不允许的,这时就需要用到Handler、Looper和Message机制来实现跨线程通信,特别是用于模拟进度条更新,让用户体验更加友好。本篇文章将深入探讨如何使用Android ...

    android handler例子

    在Android开发中,`Handler`是一个至关重要的组件,它用于处理与线程通信相关的任务,尤其是在主线程(UI线程)和工作线程之间。`Handler`、`Looper`和`Message`三者共同构成了Android的消息传递机制。下面将详细...

    Android Handler解析

    # Android Handler解析 在Android应用开发中,保持应用程序的响应性是至关重要的。为了实现这一目标,我们需要确保UI线程不会被阻塞。通常来说,将耗时的任务(如网络请求、复杂计算等)放到后台线程执行可以提高UI...

    android handler的一些测试

    在Android开发中,`Handler`、`Looper`和`Message`是实现线程间通信的重要组件,特别是用于主线程(UI线程)与其他工作线程之间的交互。标题“android handler的一些测试”暗示我们将探讨`Handler`如何在多线程环境...

    Android Handler类详解

    Android Handler类详解 Android Handler类详解 Android Handler类详解 Android Handler类详解

    Android Handler运行原理

    ### Android Handler运行原理详解 #### 一、引言 在Android开发中,线程间通信是非常重要的技术之一,其中Handler机制被广泛应用于实现主线程与子线程之间的数据交互。Handler机制不仅简单易用,而且功能强大,是...

    Android Handler机制的工作原理详析

    Android Handler机制的工作原理详析 Android Handler机制是Android系统中的一种消息机制,负责处理应用程序中的消息处理和线程之间的通信。Handler机制的工作原理可以分为以下几个部分:Looper、MessageQueue、...

    Android handler message奇怪用法详解

    Handler是Android中的一个类,它用于在不同的线程之间发送和处理消息。通常,我们使用Handler配合Looper和Message来实现在主线程(UI线程)中执行后台任务的结果。Looper是消息队列的循环器,它不断检查消息队列并...

    Android Handler 原理分析及实例代码

    在Android开发中,`Handler` 是一个至关重要的组件,它涉及到多线程、UI更新以及消息传递机制。本文将深入探讨 `Handler` 的工作原理,分析其如何在不同线程间进行通信,并通过实例代码来展示其具体用法。 ### ...

    android handler 机制 源码

    在Android系统中,Handler、Looper和Message构成了一个用于线程间通信的重要机制。这个机制使得UI线程可以处理来自其他线程的消息,从而避免了直接在非UI线程操作UI组件,防止应用出现ANR(Application Not ...

    Android Handler 图片浏览器

    在Android开发中,Handler是一种非常重要的组件,它与线程通信密切相关,特别是在更新UI和处理异步任务时。本文将深入探讨如何利用Handler构建一个图片浏览器,并结合计时器(Timer)来实现特定功能。 首先,理解...

    Android Handler机制解析

    Android Handler机制解析 Android Handler机制是Android系统中的一种机制,用于处理线程之间的通信和消息传递。在Android系统中,Handler机制是基于Java的线程机制来实现的。下面将对Android Handler机制进行详细的...

    Android Handler定时更新UI

    在Android应用开发中,Handler是实现线程间通信的关键组件,尤其在涉及到UI更新时,它的作用尤为重要。本文将深入探讨“Android Handler定时更新UI”的相关知识点,以及如何使用CounterDemo来实现这一功能。 首先,...

    android-Handler的使用

    【Android Handler 使用详解】 Handler 是 Android 平台中用于处理线程间通信的关键组件,尤其在涉及 UI(用户界面)更新时,它扮演着至关重要的角色。在 Android 应用程序启动时,系统会默认创建一个主线程,也...

    Android Handler 线程 示例代码

    在Android开发中,`Handler`、`Thread`、`Toast`、`消息队列`以及`线程`是实现UI交互和异步处理的关键概念。本文将深入探讨这些概念,并结合给定的"Android Handler 线程 示例代码"进行详细讲解。 首先,我们来看`...

Global site tag (gtag.js) - Google Analytics