Study-android 的handler和message学习

来源:互联网 发布:安卓软件限速 编辑:程序博客网 时间:2024/05/21 14:57

主要看代码:

/** *  * 关于handler、message、MessageQueue、looper * 1、一个线程Thread只有一个Looper,这个Looper不是默认有的,需要通过调用Looper.prepare(); * 和Looper.loop();启动和初始化,Activity默认是有一个Looper,所以不需要调用prepare和loop *  * 2、handler会绑定一个线程,在那个线程里面实例化则绑定那个线程,handler是用来发送和接受消息的 * handler可以发送和接受多个消息,Looper是管理handler message机制的 *  * 3、message是通过handler来操作的,可以handler主动来发送,也可以是message设置handler来发送 * 获取message的最好办法是Message.obtain()或者Handler.obtainMessage() *  * 4、post和sendMessage 在handler里面覆盖sendMessage方法来处理message * post里面的runable是跟handler实现的位置是同一个线程 *  * @author WangYD * @time 2015年8月6日 *  */public class HandlerActivity extends Activity implements OnClickListener {private static final String TAG = "HandlerActivity";private Button btn1 = null;private Button btn2 = null;/** * 这个handler是在main里面实例化,所以这个是被main线程的Looper管理,可以处理从子线程里由这个handler发送的消息 * 如果handler是在子线程里面实例化(可以在main里面声明),则这个handler是由子线程的Looper管理, * 可以处理从main线程里由这个handler发送的消息main里面的Looper是系统自动产生的, * 但是子线程的Looper需要通过调用Looper.prepare()和Looper.loop()来产生初始化Looper */@SuppressLint("HandlerLeak")private Handler handler = new Handler() {@Overridepublic void handleMessage(Message msg) {DBG.log(TAG, "main:" + msg.obj.toString());}};/** 这个在子线程里面实例化 */private Handler handler2 = null;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_handler);btn1 = (Button) findViewById(R.id.a_button1);btn2 = (Button) findViewById(R.id.a_button2);btn1.setOnClickListener(this);btn2.setOnClickListener(this);new Thread() {@SuppressLint("HandlerLeak")public void run() {Looper.prepare();handler2 = new Handler() {@Overridepublic void handleMessage(Message msg) {DBG.log(TAG, "thread:" + msg.obj.toString());}};Looper.loop();}}.start();DBG.log(TAG, "Begin Post");/** 等待handler2初始化完成 */while (handler2 == null);/** * 这个runable跟调用的handler初始的线程是同一个线程 , 使用handler的时候要等到run完成才出现按键 * 使用handler2的时候,按键是很快就出现了 */handler2.post(new Runnable() {@Overridepublic void run() {for (int i = 0; i < 9; i++) {DBG.log(TAG, "run");try {Thread.sleep(500);} catch (InterruptedException e) {e.printStackTrace();}}}});DBG.log(TAG, "After Post");}@Overridepublic void onClick(View v) {switch (v.getId()) {case R.id.a_button1:new Thread() {public void run() {handler.obtainMessage(0, "Hello Wangyidong").sendToTarget();};}.start();break;case R.id.a_button2:handler2.obtainMessage(0, "Hello World").sendToTarget();break;}}}


源码下载:http://download.csdn.net/detail/yidong_wang/8975697




0 0
原创粉丝点击