多线程实现更新android进度条。

多线程实现更新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);

}

}

};

}

相关推荐