Android笔记--handler机制

一、重要参考资料

【参考资料】 目前来看,下面的几个网址中的内容质量比较不错,基本不需要再读别的网址了。 1、android消息机制一 http://xtfncel.javaeye.com/blog/663517 2、Android消息机制二 http://xtfncel.javaeye.com/blog/663518 3、Android线程间通信的message机制 http://www.javafun.cn/viewthread.php?tid=1517 4、
5、Android中Handler的使用方法-在子线程中更新界面 http://blog.csdn.net/yangpeng98/archive/2010/05/26/5625955.aspx

二、知识要点

一、知识点 1、handler应该由处理消息的线程创建。
2、handler与创建它的线程相关联,而且也只与创建它的线程相关联。handler运行在创建它的线程中,所以,如果在handler中进行耗时的操作,会阻塞创建它的线程。 【来源】以上来自: 二、一些知识点 1、Android的线程分为有消息循环的线程和没有消息循环的线程,有消息循环的线程一般都会有一个Looper。主线程(UI线程)就是一个消息循环的线程。
2、 Looper.myLooper(); //获得当前的Looper
Looper.getMainLooper () //获得UI线程的Lopper
3、Handle的初始化函数(构造函数),如果没有参数,那么他就默认使用的是当前的Looper,如果有Looper参数,就是用对应的线程的Looper。
4、如果一个线程中调用Looper.prepare(),那么系统就会自动的为该线程建立一个消息队列,然后调用 Looper.loop();之后就进入了消息循环,这个之后就可以发消息、取消息、和处理消息。 【来源】以上来自:http://www.javafun.cn/viewthread.php?tid=1517

三、应用实例

3.1 handler传递message

【应用示例一】 package com.android.tutor;
import java.util.Timer;
import java.util.TimerTask;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
public class HandlerDemo extends Activity{

//title为setTitle方法提供变量,这里为了方便我设置成了int型
private int title= 0 ;

private HandlermHandler= new Handler(){

public void handleMessage(Messagemsg){
switch (msg.what){
case 1 :
updateTitle();
break ;
}
};
};
public void onCreate(BundlesavedInstanceState){
super .onCreate(savedInstanceState);
setContentView(R.layout.main);

Timertimer=
new Timer();
timer.scheduleAtFixedRate(
new MyTask(), 1 , 5000 );
}

private class MyTask extends TimerTask{
@Override
public void run(){

Messagemessage=
new Message();
message.what=
1 ;
mHandler.sendMessage(message);

}
}


public void updateTitle(){

setTitle(
"WelcometoMrWei'sblog" +title);
title++;
}
}


源码来自:http://blog.csdn.net/Android_Tutor/archive/2010/05/08/5568806.aspx
上面的代码,直接在主线程中定义Handler成员。在子线程中通过主线程的handler向主线程发送消息。其使用步骤如下: 1、在主线程中定义handler,并为这个handler实现handleMessage方法。 2、在子线程中调用主线程的handler,通过其sendMessage方法发送消息。
【应用示例二】

public class Activity1 extends Activity implements OnClickListener{

Button button = null;

TextView text = null;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity1);

button = (Button)findViewById(R.id.btn);

button.setOnClickListener(this);

text = (TextView)findViewById(R.id.content);

}

public void onClick(View v) {

switch (v.getId()) {

case R.id.btn:

Looper looper = Looper.myLooper();//取得当前线程里的looper

MyHandler mHandler = new MyHandler(looper);//构造一个handler使之可与looper通信

//buton等组件可以由mHandler将消息传给looper,再放入messageQueue,同时mHandler也可以接受来自looper消息

mHandler.removeMessages(0);

String msgStr = "主线程不同组件通信:消息来自button";

Message m = mHandler.obtainMessage(1, 1, 1, msgStr);//构造要传递的消息

mHandler.sendMessage(m);//发送消息:系统会自动调用handleMessage方法来处理消息

break;

}

}

private class MyHandler extends Handler{

public MyHandler(Looper looper){

super(looper);

}

@Override

public void handleMessage(Message msg) {//处理消息

text.setText(msg.obj.toString());

}

}

}


这是另一种使用handler的方法是可以派生一个Handler的子类,在子类中实现handleMessage方法。 1、定义Handler的派生类,并在子类中实现handleMessage方法。 2、在主线程的类中,定义该子类的对象。 3、在子线程中,调用主线程中的对象。

3.2 handler传递runnable对象

还有另外一种用Handler来进行线程间通信的方式,那就是用Handler来传递一个runnable对象,而不是一个message。 【应用实例三】


使用步骤 1、在主线程中定义Handler对象 2、构造一个runnable对象,为该对象实现runnable方法,在该方法中进行一些你想做的耗时操作。 3、在子线程中使用Handler对象post(runnable)对象.

更多相关文章

  1. android学习之路 Handler用法
  2. Android(2017-2018)BAT面试题整理(java篇,含答案)
  3. android 线程(一)
  4. 基于MQTT实现Android消息推送(Push…
  5. 【Android(安卓)初学】11、关于Android当中的线程(初级)
  6. Android多线程同步转异步方法总结
  7. Android(安卓)UI线程和非UI线程
  8. Android精华汇总
  9. Android(安卓)系统中WatchDog 日志分析

随机推荐

  1. 关于android版本spice协议tls端口链接方
  2. 框架设计之ADO.NET Command的ExecuteScal
  3. 使用HBuilder打包Android和iOS,并上线
  4. Android(安卓)程序读写Office文件
  5. android上面遇到的一些内存泄露问题
  6. 金三银四热潮下。Android高级工程师面试
  7. Android(安卓)适配器教程 (六)
  8. (讲课篇)让小白都能明白的Android开发-1.
  9. Android通用标题栏组合控件
  10. 【Android(安卓)异常与性能优化】冷启动