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

出于性能优化考虑,Android的UI操作不是线程安全的,这意味着如果有多个线程并发操作UI组件,可能导致线程安全问题。为了解决这个问题,Android制定了一个简单的原则:只允许UI线程修改Activity里的UI组件,试图启动一个新线程并刷新UI是不允许的。那么如何让新线程可以刷新UI呢?为了解决这个问题,Android引入了Handler来处理解决这个问题。

Handler类的主要作用有两个:

  • 在新启动的线程中发送消息
  • 在主线程中获取、处理消息


package com.qicaiz.handlertest;import android.app.Activity;import android.app.ProgressDialog;import android.os.Bundle;import android.os.Handler;import android.os.Message;import android.view.Menu;import android.view.View;import android.widget.Button;import android.widget.TextView;public class MainActivity extends Activity{TextView showTextView;Button addButton;MyHandler myHandler;@Overrideprotected void onCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);showTextView = (TextView)findViewById(R.id.showTextView);addButton = (Button)findViewById(R.id.addButton);                //在主线程中加入myHandler,当收到消息时会回调handleMessage(Message msg)方法myHandler  = new MyHandler();addButton.setOnClickListener(new View.OnClickListener(){@Overridepublic void onClick(View arg0){// TODO Auto-generated method stuMyThread myThread = new MyThread();new Thread(myThread).start();}});}        //定义一个新线程class MyThread implements Runnable{@Overridepublic void run(){// TODO Auto-generated method stubtry{Thread.sleep(10000);}catch(InterruptedException e){e.printStackTrace();}Message msg = new Message();Bundle bundle = new Bundle();bundle.putString("add", "更新UI");msg.setData(bundle);myHandler.sendMessage(msg); //myHandler在新启动的线程中发送消息}}//定义MyHandler 继承Handler并重写handleMessage(Message msg)方法class MyHandler extends Handler{                //必须重写的方法@Overridepublic void handleMessage(Message msg){// TODO Auto-generated method stubsuper.handleMessage(msg);Bundle bundle = msg.getData();String str  = bundle.getString("add");                       //当收到消息时,刷新UI                        showTextView.setText(str);}}@Overridepublic boolean onCreateOptionsMenu(Menu menu){// Inflate the menu; this adds items to the action bar if it is present.getMenuInflater().inflate(R.menu.main, menu);return true;}}


更多相关文章

  1. 浅析Android中的消息机制-解决:Only the original thread that cr
  2. Android异步消息机制之Handler
  3. Android的Handler机制详解3_Looper.looper()不会卡死主线程
  4. Android之Handler用法总结
  5. Android开发之消息处理机制(一)——Handler
  6. Android异步加载图像小结 (含线程池,缓存方法)
  7. [android]在上下文菜单的选中事件中获取列表选中的元素
  8. android 面试题集
  9. android 多点触控

随机推荐

  1. 第15天android:使用sqlite
  2. Android判断应用是否存在 及 Android 关
  3. Android NDK Eclipse 集成
  4. Android图片浏览之源码
  5. Android动态设置VIew宽高
  6. android wpa_supplicant 调试
  7. Android核心分析 ------ 电话系统之rilD
  8. Android 之各种颜色
  9. 修改SeekBar样式
  10. TextView——行间距与字母间隔