真的很弱。。。
首先就是画界面的甘蕉。。。
一个弱弱的进度条和一个弱弱的start按钮,进度条最初设置为不可见
<ProgressBar
android:id="@+id/bar"
style="?android:attr/progressBarStyleHorizontal"
android:layout_width="200dp"
android:layout_height="wrap_content"
android:visibility="gone"
/>
activity里,依旧是
1.声明控件变量,一个进度条,一个按钮
2.根据控件得到代表控件的对象
3.为按钮设置监听器
按钮监听的ButtonListener方法
4.继承OnClickListener类,复写onClick方法
4.1把进度条设置为可见
bar.setVisibility(View.VISIBLE);
4.2把线程加入线程队列,立即加入
updateBarHandler.post(updateThread);
延迟放入的方法是updateBarHandler.postDelayed(updateThread,3000);
5.线程类,该类使用匿名内部类方式进行声明
两种使用线程的方法
继承Thread类 | 需要先start方法,然后run方法 |
实现Runnable接口 | 实现run方法 |
Runnable updateThread = new Runnable(){
int i = 0;
//复写 run方法
@Override
public void run() {
// TODO Auto-generated method stub
System.out.println("Begin Thread" + i);
i+=10;
//得到一个消息对象,Message类是由Android操作系统提供的
Message msg = updateBarHandler.obtainMessage();
//将msg对象的arg1参数的值设置为i,用arg1和arg2这两个成员变量传递消息,优点是系统性能消耗小
msg.arg1 = i;
Bundle bundle = new Bundle();
bundle.putString("testme", "test bundle");
msg.setData(bundle);
try{
//设置当前显示睡眠1秒
Thread.sleep(1000);
}
catch(InterruptedException e){
e.printStackTrace();
}
if(i > 100){
//如果当i的值大于100时,就将线程对象从handler当中移除
updateBarHandler.removeCallbacks(updateThread);
}
else{
//将msg对象加入到消息队列中
updateBarHandler.sendMessage(msg);
}
}
6.Handler类,使用匿名内部类来复写Handler当中的handleMessage方法
Handler updateBarHandler = new Handler(){
@Override
public void handleMessage(Message msg) {
//改变进度条显示的进度
bar.setProgress(msg.arg1);
//获取bundle中的数据
Bundle bundle = msg.getData();
//把进程放入进程队列
updateBarHandler.post(updateThread);
System.out.println("test---->" + bundle.getString("testme"));
}
};
一些要说的:
1.实现线程有两种方法,上面表里有。其中继承Thread类的话,线程和Activity会在不同的线程中。而实现Runnable接口的话,线程和Activity会在同一个线程中。
2.Handler消息传递机制,是个异步的东西。
updateThread用来实现Runnable方法,即产生一个线程
在updateThread的run方法中,有updateBarHandler.sendMessage(msg);它只负责传递消息,将消息放入消息队列后就结束了。就像去邮局邮信,不会等待信送到。
updateBarHandler作为Handler的一个子类,继承Handler。
在其中使用内部类复写了handleMessage方法,这个方法用来处理消息。就像收信。
综上,来叙述下执行过程:
点击按钮后,调用监听器的onClick方法,把线程加入线程队列,开始执行,跳到线程部分,执行run方法(执行线程总是执行它的run方法),run方法中sendMessage。而后,Handler部分的handleMessage处理消息,处理过程中,有一步把线程加入线程队列。于是,又跳到线程部分执行run方法,直到run方法中的判断条件不符合,将线程从handler中移除。
代码备份