Android学习笔记--Handler的用法



Handler的基本概念 (可以进行另外线程的处理程序 , 优化程序 , 类似于线程概念)
异步线程处理方案

Handler基本的使用方法
代码 : 可以在事件中调用Handler的方法
例 : 在Button的单击事件中: 
Handler.post(updateThread);  // 线程对象加入到消息队列中, 此消息队列中只有一个线程对象

// 取消线程队列
handler.removeCallbacks(updateThread);

// 创建一个Handler对象
Handler handler = new Handler();

// java中实现线程的方法 1 继承thread类  2.实现runnable接口
// 将要执行的操作写在线程对象的run方法中去
Runnable updateThread = new Runnable (){
Public void run() {
System.out.println("UpdateThread");
// 在run方法内部执行postDelayed  或者 post 方法
handler.postDelayed(updateThread , 3000);  // 延迟加入消息队列
}
}

// 消息队列(数据结构) 先进先出

使用Handler更新ProgressBar

例 : main.xml中的布局
<LinearLayout xmlns="http://schmas.android.com/apk/res/android"
Android:orientation="vertical"
Android:layout_width="fill_parent"
Android:layout_height="fill_oarent" >

<ProgressBar android:id="@+id/pBar"
Style="?android:attr/progressBarStyleHorizontal"
Android:layout_width="200dp"
Android:layout_height="wrap_content"
Android:visibility="gone"  />

<Button android:id="@+id/StartButton"
Android:layout_width="fill_parent"
Android:layout_height="wrap_content"
Android:text="start" />

</LinearLayout> 

Activity中的代码:
Public class TestBarHandler extends Activity {
// 声明控件对象
ProgressBar bar = null;
Button startButton = null;

Public void onCreate (Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
// 得到控件对象
Bar = (ProgressBar)findViewById(R.id.bar);
startButton = (Button)findViewById(R.id.startButton);

// 为按钮设置监听器
startButton.setOnClickListener(new ButtonListener());
}

// 创建监听器
Class ButtonListener implements OnClickLinstener {
Public void onClick(View v) {
pBar.setVisibility(View.VISIBLE);
pBar.setMax = 200;
updateBarHandler.post(updateThread);
}
}

// 创建一个Handler对象   使用匿名内部类来复写handler的handlerMessage中
Handler updateBarHandler = new Handler() {
Public void handlerMessage(Message msg) {
bar.setProgress(mag.arg1);
updateBarHandler.post(updateThread);   // 线程加入线程队列中
}
};

// 匿名内部线程类 
Runnable updateThread = new Runnable(){
Int i = 0 ;
Public void run() {    // 直接执行了当前Activity的线程
System.out.println("begin Thread");

I = i +10;
// 得到一个消息对象 , message 类是有android操作系统提供
Message msg = updateBarHandler.obtainMessage();
// 将msg对象的arg1参数的值设置为i , 用arg1 和arg2 这两个成员变量传递消息,可以使系统的性能消耗较小
Msg.arg1 = i;
Try {
Thread.sleep(1000);
} catch ( InterruptedException e) {
e.printStackTrace();
}
// 将msg加入消息队列中
updateBarHandler.sendMessage(msg);
If(i == pBar.getMax()) {
    // 如果i的值到达最大值时,移除线程
updateBarHandler.removeCallbacks(updateThread);
}
}
};
}

4 . Handler与线程 (默认情况下Activity与Handler共享一个线程)
例 : // 证明Activity与Hnadler共享一个线程
Public class HnadlerTest extends Activity {

private Handler handler = new Handler();

public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);   // 执行完这一行代码Activity中才有控件
Handler.post(r);

//Thread t = new Thread(r);   // 独立线程
//t.start();

// currentThread 得到当前运行线程对象
System.out.println("activity----->" + Thread.currentThread().getId());
System.out.println("activityname----->" +  Thread.currentThread().getName());
}

Runnable r = new Runnable() {
Public void run () {
System.out.println("Handler----->" + Thread.currentThread().getId());
System.out.println("HandlerName----->" +  Thread.currentThread().getName());
Try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
};
}


// 输出对比  需要等待10秒,Activity中才会有控件
Activity----> 1
ActivityName ---> main
Handler----> 1
HandlerName ---> main

// 独立线程输出   无等待时间
Handler ---> 9
HandlerName ---> Thread-9 
Activity----> 1
ActivityName ---> main

5 . Bundle的用法(相对特殊的map , key一般为string , value 为个个数据类型)
// Looper , handlerThread 都可以创建一个新的线程
例 : Public class HnadlerTest extends Activity {

private Handler handler = new Handler();

public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
System.out.println("Activity ----> " + Thread.currentThread().getId());

// 生成一个HandlerThread对象,实现了使用looper来处理消息队列的功能,这个类有android内部实现
HandlerThread handlerThread = new HandlerThread();
handlerThread.start();

MyHandler myHandler = new MyHandler(handlerThread.getLooper());

// 获取消息对象
Message msg = myHandler.obtainMessage();
msg.sendToTarget();
}

Class MyHandler extends Handler {
Public MyHandler () {

}

Public MyHnadler(Looper looper) {
// 调用父类的构造函数 , 有looper的方法
Super(looper);
}

Public void handleMessage(Message msg) {
System.out.println("handler---->" + Thread.currentThread().getId());
System.out.println("HandlerMessage");
}
}
}

6 . 在新线程当中处理消息的方法
// 首先创建Message对象   
// 可以用arg1 , arg2 (int) , obj (object) , setData(Bundle data) 赋值传递
// 取值 变量 = msg.arg1等等
Bundler 例 :  // 赋值 
Bundle b = new Bundle();
b.putInt("age",20);
b.putString("name" , "zhangsan");
msg.setData(b);

 // 取值
Bundle b = msg.getData();
Int age = b.getInt("age");
String name = b.getString("name");

你可能感兴趣的:(Android学习笔记--Handler的用法)