cf 2012-08-27
多线程实现更新android进度条。
实例教程,详细信息我已经注释
packagecom.shougao.hello;
importandroid.app.Activity;
importandroid.os.Bundle;
importandroid.os.Handler;
importandroid.os.Message;
importandroid.view.View;
importandroid.view.View.OnClickListener;
importandroid.widget.Button;
importandroid.widget.ProgressBar;
publicclassHelloActivityextendsActivity{
/**Calledwhentheactivityisfirstcreated.*/
privateProgressBarprogressBar;
privateButtonstartButton;
@Override
publicvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
progressBar=(ProgressBar)findViewById(R.id.progressbar);
startButton=(Button)findViewById(R.id.startButton);
startButton.setOnClickListener(newProgressBarOnClickListener());
}
classProgressBarOnClickListenerimplementsOnClickListener{
publicvoidonClick(Viewv){
//设置进度条为可见状态
progressBar.setVisibility(View.VISIBLE);
//添加updataThread到消息队列
updateBarHandler.post(updateThread);
}
}
//使用匿名内部类来复写Handler当中的handlerMessage()方法
//这个handler是需要反复执行的,直到消息队列中没有Message为止。
//执行过程中把进度条就刷新了。
HandlerupdateBarHandler=newHandler(){
@Override
publicvoidhandleMessage(Messagemsg){
System.out.println("----------starthandle");
progressBar.setProgress(msg.arg1);
updateBarHandler.post(updateThread);//将要执行的线程放入到队列当中
}
};
//线程类,该类使用匿名内部类的方式进行声明
RunnableupdateThread=newRunnable(){
inti=0;
publicvoidrun(){
//TODOAuto-generatedmethodstub
System.out.println("----------BeginThread");
i+=20;
//得到一个消息对象,Message类是android系统提供的
Messagemsg=updateBarHandler.obtainMessage();
//将Message对象的arg1参数的值设置为i
msg.arg1=i;//用arg1、arg2这两个成员变量传递消息,优点是系统性能消耗较少
try{
Thread.sleep(3000);//让当前线程休眠1000毫秒
}catch(InterruptedExceptionex){
ex.printStackTrace();
}
//将Message对象加入到消息队列当中,等下次looper调用消息队列时,使用这个message显示进度条
//或者说,把增加了10%的进度信息Message放到updateBarHandler的队列中。
if(i<101){
updateBarHandler.sendMessage(msg);
}
//如果i的值等于100
if(i==100){
//将线程对象从队列中移除
updateBarHandler.removeCallbacks(updateThread);
}
}
};
}