package cn.com.sxp;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ProgressBar;
public class HandlerTwoActivity extends Activity {
private ProgressBar progressBar;
private Button startButton;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
progressBar = (ProgressBar)findViewById(R.id.progressbar);
startButton = (Button)findViewById(R.id.startButton);
startButton.setOnClickListener(new buttonOnClickListener());
}
class buttonOnClickListener implements OnClickListener{
public void onClick(View v) {
// 点击一下进度条就可见
progressBar.setVisibility(View.VISIBLE);
updateBarHandler.post(updateThread);
}
}
Handler updateBarHandler = new Handler(){
@Override
public void handleMessage(Message msg) {
progressBar.setProgress(msg.arg1);
// 將要執行的線程放入隊列中
updateBarHandler.post(updateThread);
}
};
Runnable updateThread = new Runnable(){
int counter = 0;
public void run() {
// TODO Auto-generated method stub
Log.d("in updateThread run()","在updateThread run方法中");
counter += 10;
// 从系统处得到一个消息
// Returns a new Message from the global message pool. More efficient than creating and allocating new instances. The retrieved message has its handler
// set to this instance (Message.target == this). If you don't want that facility, just call Message.obtain() instead.
Message msg = updateBarHandler.obtainMessage();
//将Message对象的arg1参数的值设置为i
// arg1 and arg2 are lower-cost alternatives to using setData() if you only need to store a few integer values.
msg.arg1 = counter; //用arg1、arg2这两个成员变量传递消息,优点是系统性能消耗较少
try {
Thread.sleep(1000); //让当前线程休眠1000毫秒
}catch(InterruptedException ex){
ex.printStackTrace();
}
//将Message对象加入到消息队列当中
updateBarHandler.sendMessage(msg);
if (100 == counter){
updateBarHandler.removeCallbacks(updateThread);
}
}
};
}
运行效果如下:
点击“点我”,日志打印如下:
但是当我退出这个活动,这个线程还在输出,显然线程没有停止,因此这里必须得让handler清除队列中的消息。
· .NET 9中的异常处理性能提升分析:为什么过去慢,未来快
· 字符集、编码的前世今生
· Web性能优化:从 2 秒到200毫秒
· WPF 使用GDI+提取图片主色调并生成Mica材质特效背景
· golang遍历处理map时的常见性能陷阱
· 垃圾qt,毁我青春
· 开发十年现状之我的工作经历
· DeepSeek为什么现在感觉不火了?
· 一种更简单的方式运行 C# 代码,简化 C# 开发体验!
· .NET 9中的异常处理性能提升分析:为什么过去慢,未来快