看了下mars老师的视频,发现用handler处理进度条有两种方法,一种是纯粹的的通过调用post方法使进度条自增,另一种是通过发送message,然后通过handlemessage()方法来处处理信息,然后调用post(),在run()里面又发送mesage,如此实现循环。
第一种方法:
public class handler extends Activity{
private Handler handler;
private ProgressBar bar;
private int i = 0;
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.handler);
handler = new Handler();
bar = (ProgressBar)findViewById(R.id.progressbar);
//设置progressbar的最大值
bar.setMax(150);
//把线程加到线程队列中
handler.post(runit);
}
Runnable runit = new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
if (i==0) {
bar.setVisibility(View.VISIBLE);
}
else if (i<bar.getMax()) {
bar.setProgress(i);
bar.setSecondaryProgress(i+10);
}
else {
finish();
}
i = i+10;
//相当于回调,再次把线程加到队列中,不过延迟500毫秒
handler.postDelayed(runit, 500);
}
};
}
public class handler2 extends Activity{
private ProgressBar bar2;
private Handler handler2;
private int i = 0;
private Message msg;
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.handler);
bar2 = (ProgressBar)findViewById(R.id.progressbar);
bar2.setVisibility(View.VISIBLE);
handler2 = new Handler(){
//通过handleMessage()方法来处理信息,同时把线程加到队列中
public void handleMessage(Message msg) {
bar2.setProgress(msg.arg1);
handler2.post(runit2);
}
};
//把一个线程加到队列中去,循环的开头
handler2.post(runit2);
}
Runnable runit2 = new Runnable() {
public void run() {
// TODO Auto-generated method stub
i = i+10;
msg = handler2.obtainMessage();//???
msg.arg1 = i;
try {
Thread.sleep(100);
} catch (Exception e) {
e.printStackTrace();
}
//在线程中发送信息,实现循环
handler2.sendMessage(msg);
if (i == 100) {
finish();
}
}
};
}
这里我又一个不明白的地方:
msg = handler2.obtainMessage();//???
这里为什么不new一个message的实例?查了API,上面说这个方法默认设置了Message.target == this,这是什么意思???希望高手解答!