android-Handler01
1.Looper: 一个线程可以产生一个Looper对象,由它来管理此线程里的Message Queue(消息队列)。
2.Handler: 你可以构造Handler对象来与Looper沟通,以便push新消息到Message Queue里;或者接收Looper(从Message Queue取出)所送来的消息。
3. Message Queue(消息队列):用来存放线程放入的消息。
线程队列机制
更新进度条
class StartButtonListener implements OnClickListener{
@Override
public void onClick(View v) {
//调用Handler的post方法,将要执行的线程对象添加到队列当中
handler.post( updateThread);
}
}
class EndButtonListener implements OnClickListener{
@Override
public void onClick(View v) {
handler.removeCallbacks( updateThread);
}
}
//将要执行的操作写在线程对象的run方法当中
Runnable updateThread = new Runnable(){
@Override
public void run() {
System. out.println( "UpdateThread");
//在run方法内部,执行postDelayed或者是post方法
handler.postDelayed( updateThread, 3000);
}
};
消息队列机制
public class MainActivity extends Activity {
/** Called when the activity is first created. */
//声明控件变量
ProgressBar bar = null;
Button startButton = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout. activity_main);
//根据控件的ID得到代表控件的对象,并为按钮设置监听器
bar = (ProgressBar)findViewById(R.id. bar);
startButton = (Button)findViewById(R.id. startButton);
startButton.setOnClickListener( new ButtonListener());
}
//当点击startButton按钮时,就会执行ButtonListener的onClick方法
class ButtonListener implements OnClickListener{
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
bar.setVisibility(View. VISIBLE);
System. out.println( "woxianzhixn 111----");
handler.post( updateThread);
}
}
//使用匿名内部类来复写Handler当中的handleMessage方法
Handler handler = new Handler(){
@Override
public void handleMessage(Message msg) {
System. out.println( "woxianzhixn 222----");
bar.setProgress(msg. arg1);
handler.post( updateThread);
System. out.println( "执行");
}
};
//线程类,该类使用匿名内部类的方式进行声明
Runnable updateThread = new Runnable(){
int i = 0 ;
@Override
public void run() {
System. out.println( "Begin Thread");
i = i + 10 ;
//得到一个消息对象,Message类是有Android操作系统提供
Message msg = handler.obtainMessage();
//将msg 对象的arg1参数的值设置为i,用arg1和arg2这两个成员变量传递消息,优点是系统性能消耗较少
msg. arg1 = i ;
try {
//设置当前显示睡眠1秒
Thread. sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//将msg 对象加入到消息队列当中
handler.sendMessage(msg);
if( i == 100){
//如果当i的值为100时,就将线程对象从handler当中移除
handler.removeCallbacks( updateThread);
}
}
};
}