A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© asd19860 中级黑马   /  2015-10-8 11:03  /  163 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

1. AndroidUI时线程不安全的,如果在子线程中更新UI会出现异常,导致程序崩溃。
为了解决如上这些问题,我们常用的做法就是使用Android的异步消息机制实现即可(创建一个Message对象,使用Handler发送出去,然后在HandlerhandleMessage()方法中获得刚才发送的Message对象,然后在这里进行UI操作)。所以说还是很有必要了解异步消息机制的Looper , Handler , Message等原理的。
下面展示一个示例使用,然后通过源码分析吧。
  1. public class MainActivity extends Activity {

  2.     public static final int UPDATE_TEXT = 1;

  3.     private TextView text;

  4.     private Button changeText;

  5.     private Handler handler = new Handler(){
  6.     @Override
  7.     public void handleMessage(Message msg) {
  8.         switch (msg.what){
  9.             case UPDATE_TEXT:
  10.                 text.setText("Nice yo see you again");
  11.                 break;
  12.             default:
  13.                 break;
  14.         }
  15.     }
  16. };

  17.     @Override
  18.     protected void onCreate(Bundle savedInstanceState) {
  19.         super.onCreate(savedInstanceState);
  20.         setContentView(R.layout.activity_main);
  21.         text = (TextView) findViewById(R.id.text);
  22.         changeText = (Button) findViewById(R.id.change_text);
  23. //        changeText.setOnClickListener(this);

  24.         changeText.setOnClickListener(new OnClickListener() {
  25.             @Override
  26.             public void onClick(View view) {
  27.                 switch ((view.getId())){
  28.                     case R.id.change_text:
  29.                         new Thread(new Runnable() {
  30.                             @Override
  31.                             public void run() {
  32. //                                若直接更新TextView的内容会报错,下面使用异步消息处理机制
  33. //                                text.setText("Nice to see you,BUG");
  34.                                 Message message = new Message();
  35.                                 message.what = UPDATE_TEXT;
  36.                                 handler.sendMessage(message);
  37.                             }
  38.                         }).start();
  39.                         break;
  40.                     default:
  41.                         break;
  42.                 }
  43.             }
  44.         });
  45.     }

  46. }
复制代码

这里我们先是定义了一个整型常量UPDATE_TEXT,用于表示更新TextView 这个动作。然后新增一个Handler 对象,并重写父类的handleMessage 方法,在这里对具体的Message进行处理。如果发现Message what 字段的值等于UPDATE_TEXT,就将TextView 显示的内容改成Nice to see you again
下面再来看一下Change Text 按钮的点击事件中的代码。可以看到,这次我们并没有在子线程里直接进行UI 操作,而是创建了一个Messageandroid.os.Message)对象,并将它what 字段的值指定为UPDATE_TEXT,然后调用Handler sendMessage()方法将这Message 发送出去。很快,Handler 就会收到这条Message,并在handleMessage()方法中对它进行处理。注意此时handleMessage()方法中的代码就是在主线程当中运行的了,所以我们可以放心地在这里进行UI 操作。接下来对Message 携带的what 字段的值进行判断,如果等于UPDATE_TEXT,就将TextView 显示的内容改成Nice to see you again

常用的APP在线自动化测试工具:www.ineice.com

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马