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) {
https://blog.51cto.com/apprentice/1360572