在一个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,通常会抛出下面的异常:

11-07 13:33:04.393: 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://hi.baidu.com/lbz126/blog/item/de073313ac543fcda6ef3fc7.html

更多相关文章

  1. android使用HttpClient和URLConnection获取网页内容
  2. Android性能调优
  3. Android的Handler总结(1)
  4. Android四大组件之 服务Service
  5. Android中UI主线程与子线程
  6. AsyncTask总结
  7. AsyncTask
  8. Android之Handler用法总结
  9. 对Android进程优先级和Service的理解

随机推荐

  1. Android菜鸟的成长笔记(14)—— Android中
  2. android自定义checkBox的样式
  3. 【重拾Android】(2)SQLite数据库与数据持
  4. Android群英传笔记——第六章:Android绘图
  5. Android绘图机制(三)——自定义View的实现
  6. Android的任务栈task stack
  7. android 代码优化(2)
  8. 帮助ADT改进DDMS中的Logcat中文乱码问题
  9. Android So简单加固
  10. Android的Binder的起源-android学习之旅(1