博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android入门:Handler简介与实例
阅读量:4584 次
发布时间:2019-06-09

本文共 4416 字,大约阅读时间需要 14 分钟。

转自:http://www.bdqn.cn/news/201303/8038.shtml

1、Handler简介

Handler 为Android操作系统中的线程通信工具,包为android.os.Handler。

与Handler绑定的有两个队列,一个为消息队列,另一个为线程队列。Handler可以通过这两个队列来分别:

发送、接受、处理消息–消息队列;

启动、结束、休眠线程–线程队列;

Android OS中,一个进程被创建之后,主线程(可理解为当前Activity)创建一个消息队列,这个消息队列维护所有顶层应用对象(Activities, Broadcast receivers等)以及主线程创建的窗口。你可以在主线程中创建新的线程,这些新的线程都通过Handler与主线程进行通信。通信通过新线程调用Handler的post()方法和sendMessage()方法实现,分别对应功能:

post() 将一个线程加入线程队列;

sendMessage() 发送一个消息对象到消息队列;

当然,post()方法还有一些变体,比如postDelayed()、postAtTime()分别用来延迟发送、定时发送;

消息的处理,在主线程的Handler对象中进行;具体处理过程,需要在new Handler对象时使用匿名内部类重写Handler的handleMessage(Message msg)方法;

从消息队列中获取消息。

线程加入线程队列可以在主线程中也可以在子线程中进行,但都要通过主线程的Handler对象调用post()。

2、Handler实例

与ProgressBar结合的例子:

 

package mars.barhandler;        import android.app.Activity;    import android.os.Bundle;    import android.os.Handler;    import android.os.Message;    import android.view.View;    import android.view.View.OnClickListener;    import android.widget.Button;    import android.widget.ProgressBar;        public class TestBarHandler extends Activity {            /** Called when the activity is first created. */            //声明控件变量            ProgressBar bar = null;            Button startButton = null;            @Override            public void onCreate(Bundle savedInstanceState) {                    super.onCreate(savedInstanceState);                    setContentView(R.layout.main);                    //根据控件的ID得到代表控件的对象,并为按钮设置监听器                    bar = (ProgressBar)findViewById(R.id.bar);                    startButton = (Button)findViewById(R.id.startButton);                    startButton.setOnClickListener(new ButtonListener());            }            //当点击startButton按钮时,就会执行ButtonListener的onClick方法            class ButtonListener implements OnClickListener{                        public void onClick(View v) {                            // TODO Auto-generated method stub                            bar.setVisibility(View.VISIBLE);                            updateBarHandler.post(updateThread);                    }                                }            //使用匿名内部类来复写Handler当中的handleMessage方法            Handler updateBarHandler = new Handler(){                        @Override                    public void handleMessage(Message msg) {                            bar.setProgress(msg.arg1);                            Bundle bundle = msg.getData();                            updateBarHandler.post(updateThread);                            System.out.println("test---->" + bundle.getString("test"));                    }                                };            //线程类,该类使用匿名内部类的方式进行声明            Runnable updateThread = new Runnable(){                    int i = 0 ;                    public void run() {                            System.out.println("Begin Thread" + i);                            i = i + 10 ;                            //得到一个消息对象,Message类是有Android操作系统提供                            Message msg = updateBarHandler.obtainMessage();                                                        //将msg对象的arg1参数的值设置为i,用arg1和arg2这两个成员变量传递消息,优点是系统性能消耗较少                            msg.arg1 = i ;                            Bundle bundle = new Bundle();                            bundle.putString("test", "test bundle");                            msg.setData(bundle);                            try {                                    //设置当前显示睡眠1秒                                    Thread.sleep(1000);                            } catch (InterruptedException e) {                                    // TODO Auto-generated catch block                                    e.printStackTrace();                            }                            //将msg对象加入到消息队列当中                            if( i > 100){                                    //如果当i的值为100时,就将线程对象从handler当中移除                                    updateBarHandler.removeCallbacks(updateThread);                                    System.out.println(">>>>>>");                            }else{                                    updateBarHandler.sendMessage(msg);                                    System.out.println("<<<<<<");                            }                    }            };            class MyThread extends Thread{                    public void run(){                                                }            }                }

  

 

转载于:https://www.cnblogs.com/liuqingsha3/p/4899952.html

你可能感兴趣的文章
软考知识点梳理--综合布线
查看>>
Mysql5.6主从热备配置
查看>>
VS2010DebugView捕捉
查看>>
mfix中更改time dependent VTK filename的最大时间步数的容量
查看>>
Windows7安装 docker-compose的过程
查看>>
关于nodeJS多线程的支持,目前看来无法实现,讲解v8的一些东西
查看>>
php递归创建文件夹的两种方法
查看>>
6.新增事件
查看>>
|洛谷|二分|P1182 数列分段Section II
查看>>
少儿编程Scratch第四讲:射击游戏的制作,克隆的奥秘
查看>>
Oracle学习第七课-表连接及其应用
查看>>
Python基础篇【第十三篇】:面向对象
查看>>
bzoj 2465 小球
查看>>
String类
查看>>
NoSQL简介
查看>>
java_2018_Day5_变量的格式
查看>>
在C++中调用DLL中的函数
查看>>
leetcode 32. Longest Valid Parentheses
查看>>
OpenSSL创建私有CA
查看>>
CSS3画腾讯QQ图标 无图片和js参考
查看>>