一、Handler的基本概念
在手机开发的过程中有很多功能是不能放在Activity的正常操作中,费时,用户体验差,一般都将下载功能、数据处理等都放在一个单独的线程中处理。
Handler在android里负责发送和处理消息。它的主要用途有:
1)按计划发送消息或执行某个Runnanble(使用POST方法);
2)从其他线程中发送来的消息放入消息队列中,避免线程冲突(常见于更新UI线程)
二、Handler基本使用方法
main.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > <Button android:id="@+id/startButton" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="开始" /> <Button android:id="@+id/endButton" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="jies"/> </LinearLayout>
HandlerActivity.java
package com.android.activity;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
public class HandlerActivity extends Activity {
//声明两个按钮控件
private Button startButton = null;
private Button endButton = null;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
//根据控件的ID得到代表控件的对象,并未这两个按钮设置相应的监听器
startButton = (Button)findViewById(R.id.startButton);
startButton.setOnClickListener(new StartButtonListener());
endButton = (Button)findViewById(R.id.endButton);
endButton.setOnClickListener(new EndButtonListener());
}
//1.创建一个Handler对象
Handler handler = new Handler();
//3.要执行的操作写在线程对象的run方法当中
Runnable updateThread = new Runnable(){
public void run() {
System.out.println("执行了操作。。。");
//在run方法内部,执行postDelayed或者是post方法,将updateTread这个线程加入到消息队列当中/3000ms
handler.postDelayed(updateThread, 3000);
}
};
class StartButtonListener implements OnClickListener{
public void onClick(View v) {
//2.调用Handler的post方法,将要执行的线程对象添加到队列当中,没有延时
handler.post(updateThread);
}
}
class EndButtonListener implements OnClickListener{
public void onClick(View v) {
handler.removeCallbacks(updateThread);
}
}
}
运行结果:
输出情况:
三、使用Handler更新ProgressBar
main.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > <ProgressBar android:id="@+id/bar" 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>
HandlerProgressBar.java
package com.android.activity;
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 HandlerProgressBarActivity extends Activity {
//声明控件变量
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) {
bar.setVisibility(View.VISIBLE);
//1.将线程添加到“线程”的消息队列中,并第一次执行updateThread这个线程
updateBarHandler.post(updateThread);
}
}
//使用匿名内部类来重写Handler当中的handleMessage方法
Handler updateBarHandler = new Handler(){
@Override
public void handleMessage(Message msg) {
bar.setProgress(msg.arg1);
//3.将线程添加到“线程”的消息队列中
updateBarHandler.post(updateThread);
}
};
//2.线程类,该类使用匿名内部类的方式进行声明
Runnable updateThread = new Runnable(){
int i = 0 ;
public void run() {
System.out.println("Begin Thread");
i = i + 10 ;
//得到一个消息对象,Message类是有Android操作系统提供
Message msg = updateBarHandler.obtainMessage();
//将msg对象的arg1参数的值设置为i,用arg1和arg2这两个成员变量传递消息,优点是系统性能消耗较少
msg.arg1 = i ;
try {
//设置当前显示睡眠1秒
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
//将msg对象加入到“消息”的消息队列当中,可以被handleMessage接收到
updateBarHandler.sendMessage(msg);
if( i == 100){
//如果当i的值为100时,就将线程对象从handler当中移除
updateBarHandler.removeCallbacks(updateThread);
}
}
};
}
运行结果: