Android中使用Handler机制更新UI的两种方法

Handler.post()

  • 在post()方法里更新UI
public class MainActivity extends Activity {     private TextView text;    private Handler handler = new Handler();     @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        text = (TextView) findViewById(R.id.id_text);                final MyRunnable myRunnable = new MyRunnable();         /**         * new Thread()在该线程中实现你具体的业务逻辑,比如网络请求,耗时操作等等;         * new Thread()是一个子线程,是非UI线程,如果在该线程中需要更新界面,则需要使用Handler;         *         */                  /**          * 使用参数式匿名内部类          */        new Thread() {            @Override            public void run() {//在run()方法实现业务逻辑;                //...                 //更新UI操作;                handler.post(new Runnable() {                    @Override                    public void run() {                        text.setText("使用Handler更新了界面");                    }                });             }        }.start();                /**         * 使用成员内部类         */          new Thread() {             @Override            public void run() {                handler.post(myRunnable);//调用Handler.post方法;            }        }.start();    }        class MyRunnable implements Runnable {//内部类实现Runnable接口;         @Override        public void run() {//还是在Runnable重写的run()方法中更新界面;            text.setText("使用Handler更新了界面");        }    }}

使用sendMessage(),handleMessage()

  • sendMessage()方法用于在线程中向Handler发送一个消息,handleMessage()用于捕获该消息并且更新UI
public class MainActivity extends Activity {     private TextView text;    private Handler handler = new Handler() {         @Override        public void handleMessage(Message msg) {            switch (msg.what) {                case 1:                text.setText("使用Handler更新了界面");                    break;            }        }    };     @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        text = (TextView) findViewById(R.id.id_text);         new Thread() {             @Override            public void run() {                //...你的业务逻辑;                Message message = new Message();//发送一个消息,该消息用于在handleMessage中区分是谁发过来的消息;                message.what = 1;                handler.sendMessage(message);            }        }.start();    }}

使用runOnUiThread和使用handler的区别

  • runOnUiThread是直接将一个Runnable对象封装成Message,交给主线程的Looper去执行;而Handler想要得到同样的效果,那首先Handler绑定的Looper必须是主线程的Looper,可以通过Looper.getMainLooper()获取。然后也是通过post去发送一个runable对象。
  • 从实现原理上,两者别无二致,runOnUiThread也是借助Handler实现的。
    对于使用场景,runOnUiThread用法简单,并且共享了同一个Handler,用起来高效、方便。另外,如果在主线程中直接调用,runOnUiThread也可以判断并立即执行,不再推入消息队列。
    而Handler由于更加基础,所以可定制性要比runOnUiThread强,可以实现标记、延时等功能,并且可以推入其他消息循环线程而非主线程。

更多相关文章

  1. android字体闪烁动画(线程)
  2. Android消息处理机制4——Looper
  3. 多线程实现更新android进度条。
  4. Android 线程池管理
  5. Android中更新UI的线程:Thread 、Handler、Looper、TimerTask等
  6. 跨平台移动开发 Android使用JPush推送消息
  7. Android中的线程
  8. 浅谈Android中的线程的通信及Handle机制

随机推荐

  1. android xml解析 XmlPullParser的使用
  2. Android(安卓)sudio 编译工程错误记录
  3. android strings.xml 转义字符介绍
  4. 安装后新建Android出现“AndroidManifest
  5. Android通知Notification的使用(一)
  6. android 遍历所有控件
  7. Android(安卓)实现 圆形进度对话框 和 水
  8. Android(安卓)开发经验Tips(5)
  9. android 安卓 停止指定的Service
  10. Android中那些权限