[转]android Handler使用
转 http://blog.csdn.net/new_abc/article/details/8184634
不过这个我看不懂 不知道为什么i的值可以接着增长。。。
package com.example.test1; 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 MyHandlerActivity1 extends Activity { /** Called when the activity is first created. */ // 声明控件变量 ProgressBar bar = null; Button startButton = null; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 根据控件的ID得到代表控件的对象,并为按钮设置监听器 bar = (ProgressBar) findViewById(R.id.bar); startButton = (Button) findViewById(R.id.startButton); startButton.setOnClickListener(new ButtonListener()); } // 当点击startButton按钮时,就会执行ButtonListener的onClick方法 // 内部类 ButtonListener是类名 (内部类在GUI中非常常见 主要是事件和线程的处理) class ButtonListener implements OnClickListener { public void onClick(View v) { // TODO Auto-generated method stub bar.setVisibility(View.VISIBLE); //handler.post(r)其实这样并不会新起线程,只是执行的runnable里的run()方法, //却没有执行start()方法,所以runnable走的还是UI线程。 updateBarHandler.post(updateThread); } } // 使用匿名内部类来复写Handler当中的handleMessage方法 // updateBarHandler 是类的实例名 // 注意虽然这里写着Handler 但是updateBarHandler 实际上可以理解为是Handler子类的对象 // 因此 这里的匿名指的是Handler的子类匿名了 // 这里子类重写了handleMessage 方法 //http://ayis.iteye.com/blog/219590 Handler updateBarHandler = new Handler() { @Override public void handleMessage(Message msg) { bar.setProgress(msg.arg1); Bundle bundle = msg.getData(); updateBarHandler.post(updateThread); System.out.println("test---->" + bundle.getString("test")); } }; // 线程类,该类使用匿名内部类的方式进行声明 // 这里Runnable 是一个街口 有一个类实现了它 类的内容就是 这个{。。。}中的内容 // 因为我们不知道这个实现了Runable接口的类的名字 所以匿名 // http://www.cnblogs.com/nerxious/archive/2013/01/25/2876489.html Runnable updateThread = new Runnable() { int i = 0; public void run() { System.out.println("Begin Thread" + i); i = i + 10; // 得到一个消息对象,Message类是有Android操作系统提供 Message msg = updateBarHandler.obtainMessage(); // 将msg对象的arg1参数的值设置为i,用arg1和arg2这两个成员变量传递消息,优点是系统性能消耗较少 msg.arg1 = i; Bundle bundle = new Bundle(); bundle.putString("test", "test bundle"); msg.setData(bundle); try { // 设置当前显示睡眠1秒 Thread.sleep(1000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } // 将msg对象加入到消息队列当中 if (i > 100) { // 如果当i的值为100时,就将线程对象从handler当中移除 updateBarHandler.removeCallbacks(updateThread); System.out.println(">>>>>>"); } else { updateBarHandler.sendMessage(msg); System.out.println("<<<<<<"); } } }; }