`
superonion
  • 浏览: 127033 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

Android UI主线程与子线程

阅读更多

       在一个Android 程序开始运行的时候,会单独启动一个Process。默认的情况下,所有这个程序中的Activity或者Service(Service和 Activity只是Android提供的Components中的两种,除此之外还有Content Provider和Broadcast Receiver)都会跑在这个Process。

       一个Android 程序默认情况下也只有一个Process,但一个Process下却可以有许多个Thread。
  
       在这么多Thread当中,有一个Thread,我们称之为UI Thread。UI Thread在Android程序运行的时候就被创建,是一个Process当中的主线程Main Thread,主要是负责控制UI界面的显示、更新和控件交互。在Android程序创建之初,一个Process呈现的是单线程模型,所有的任务都在一个线程中运行。因此,我们认为,UI Thread所执行的每一个函数,所花费的时间都应该是越短越好。而其他比较费时的工作(访问网络,下载数据,查询数据库等),都应该交由子线程去执行,以免阻塞主线程。


       那么,UI Thread如何和其他Thread一起工作呢?常用方法是:

       诞生一个主线程的Handler物件,当做Listener去让子线程能将讯息Push到主线程的Message Quene里,以便触发主线程的handlerMessage()函数,让主线程知道子线程的状态,并在主线程更新UI。


       例如,在子线程的状态发生变化时,我们需要更新UI。如果在子线程中直接更新UI,通常会抛出下面的异常:

ERROR/JavaBinder(1029):android.view.ViewRoot$CalledFromWrongThreadException:Only the original thread that created a view hierarchy can touch its views.

     

       意思是,无法在子线程中更新UI。为此,我们需要通过Handler物件,通知主线程Ui Thread来更新界面。

       如下,首先创建一个Handler,来监听Message的事件:

 

      private final int UPDATE_UI = 1;
      private Handler mHandler = new MainHandler();
     
      private class MainHandler extends Handler {
         @Override
             public void handleMessage(Message msg) {
             switch (msg.what) {
                 case UPDATE_UI: {
                Log.i("TTSDeamon", "UPDATE_UI");
                showTextView.setText(editText.getText().toString());
                ShowAnimation();
                     break;
                 }
                 default:
                     break;
             }
         }
       }

 

    或者:

    private Handler mHandler = new Handler(){
         @Override
             public void handleMessage(Message msg) {
             switch (msg.what) {
                 case UPDATE_UI: {
                Log.i("TTSDeamon", "UPDATE_UI");
                showTextView.setText(editText.getText().toString());
                ShowAnimation();
                     break;
                 }
                 default:
                     break;
             }
          }
      }

 

 

        当子线程的状态发生变化,则在子线程中发出Message,通知更新UI。

        mHandler.sendEmptyMessageDelayed(UPDATE_UI, 0);

   
        在我们的程序中,很多Callback方法有时候并不是运行在主线程当中的,所以如果在Callback方法中更新UI失败,也可以采用上面的方法。

 

 

转自:http://jinguo.iteye.com/blog/660073

 

 

 

分享到:
评论

相关推荐

    Android主线程和子线程区别详解

    主线程和子线程的区别 每个线程都有一个唯一标示符,来区分线程中的主次关系的说法。 线程唯一标示符:Thread.Current... Main函数为主线程,id标示符与UI界面主线程相等 不多说了。看下面的测试代码注释吧。 pu

    安卓UI线程和子线程通讯更新UI实例

    Android ,非MainActivity类中的子线程和UI线程通讯,并且获取子线程传递的信息,更新UI界面。需要使用okHttp类库

    android中UI主线程与子线程深入分析

    主要介绍了android中UI主线程与子线程,以实例形式较为深入的分析了UI主线程与子线程的运行原理与操作技巧,有助于深入了解Android程序设计,需要的朋友可以参考下

    python主线程与子线程的结束顺序实例解析

    这篇文章主要介绍了python主线程与子线程的结束顺序实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 引用自 主线程退出对子线程的影响 的一段话: 对于...

    android主线程和子线程之间消息传递详解

    主要介绍了android主线程和子线程之间消息传递详解,主线程发送消息到子线程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

    Android的线程使用来更新UI

    Android 线程 更新UI 操作UI

    Android Handler主线程和一般线程通信的应用分析

    Handler的定义:主要接受子线程发送的数据, 并用此数据配合主线程更新UI.解释: 当应用程序启动时,Android首先会开启一个主线程 (也就是UI线程) , 主线程为管理界面中的UI控件,进行事件分发, 比如说, 你要是点击一个...

    python GUI库图形界面开发之PyQt5 UI主线程与耗时线程分离详细方法实例

    在做界面开发时,无论是移动端的Android,还是我们这里讲的PyQt5,经常会有一个界面开发准则,那就是UI主线程与耗时子线程一定要分开,主线程负责刷新界面,耗时操作,如网络交互、磁盘IO等,都应该放在子线程里执行...

    Android线程与消息机制讲解与源码例程

    3)源码例程是举例:用户子线程进行定时,每到一定的时间后用户子线程以消息的方式发送给UI主线程,UI主线程接受到子线程的消息后,改变界面显示(图片会闪烁) 并且可以控制用户子线程的运行与禁止

    android多线程

    当一个程序第一次启动时,Android会同时启动一个对应的主线程(Main Thread),主线程主要负责处理与UI相关的事件,如:用户的按键事件,用户接触屏幕的事件以及屏幕绘图事件,并把相关的事件分发到对应的组件进行...

    Android中AsyncTask实现多线程计数

    Android中AsyncTask实现多线程计数,UI主线程运行,启动另一个线程计数并在UI主线程上显示.

    Android 线程开发 开发实例

    我们的主线程(UI线程)就是一个消息循环的线程。针对这种消息循环的机制,我们引入一个新的机制Handle,我们有消息循环,就要往消息循环里 面发送相应的消息,自定义消息一般都会有自己对应的处理,消息的发送和...

    android 服务组件多线程交互

    android 的service和activity是运行在UI主线程的。在android线程中,只有主线程即UI线程有自己的默认的消息队列。子线程需要创建自己的消息队列,并把消息发给队列,并循环起来,发给handler处理。

    Android项目设计与开发:UI线程冲突.ppt

    嵌入式Android项目设计与开发 第七章 多线程 ——(2)UI线程冲突 多线程 即使Android可以使用线程, 但规定不能使用子线程修改主线程的内容。 多线程 可以考虑在子线程中使用runOnUiThread重新载入UI线程,并干预...

    Android的消息处理机制

    详细描述了Android的UI主线程和子线程的消息通信机制,提供了一些参考代码

    子线程和主线程5种交互方式 Demo

    android 中的五中子线程和主线程交互方式,可针对整个activity的UI或者单个View

    异步线程AsyncTask

    首先明确Android之所以有Handler和AsyncTask 都是为了不阻塞主线程(UI线程) 且UI的更新只能在主线程中完成 因此异步处理是不可避免的 Android为了降低这个开发难度 提供了AsyncTask AsyncTask就是一个封装过的...

    浅谈Android 的线程和线程池的使用

    Android 中主线程交 UI 线程,主要作用是运行四大组件以及处理它们和用户的交互;子线程的作业则是执行耗时任务。 Android 中的线程形态 1、AsyncTask AsyncTask 是一种轻量级的异步任务类,可以在线程池中执行后台...

Global site tag (gtag.js) - Google Analytics