1.Handler的基本概念
下載,連接網絡各種費時的事不能放在主線程裏面做,不然會導致長時間無響應出錯。所以要放在子線程裏面做。
安卓最近的版本里面如果主線程裏連接了網絡,會拋出InternetOnMainStream的異常。這些不多說
2.Handler的使用
一個簡單的Handler例子(部分代碼)
private Handler handler=new Handler();
private Runnable childThread=new Runnable(){
@Override
public void run() {
System.out.println("in childThread");
//把childThread線程加到線程隊列去
//3000代表,3秒之後加入線程隊列,調用run()方法
handler.postDelayed(childThread, 3000);
//---這樣的效果是,一旦線程開啓,那麼每隔3秒,就會執行一次run(),打印一次in childThread
}
};
//startbutton-->onClick
public void startButtonClicked(View v){
//把線程加到線程隊列去
//會立即執行childThread的run()方法
handler.post(childThread);
}
//endbutton-->onClick
public void endButtonClicked(View v){
//刪除線程隊列中的childThread
handler.removeCallbacks(childThread);
}
private ProgressBar progressBar;
private int progress=0;
private Handler progressBarHandler=new Handler(){
public void handleMessage(android.os.Message msg) {
progressBar.setProgress(msg.getData().getInt("progress"));
progressBarHandler.postDelayed(newThread, 1000);
}
};
private Runnable newThread=new Runnable(){
@Override
public void run() {
if(progress<=100){
System.out.println("progressing");
/*
* 還有一種寫法:
* Message msg=progressBarHandler.obtainMessage();
* msg.arg1=progress;
* 然後在handleMessage中取arg1的值就可以了
*/
Message msg=new Message();
msg.getData().putInt("progress", progress);
progressBarHandler.sendMessage(msg);
progress+=10;
}else{
progressBarHandler.removeCallbacks(newThread);
}
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
progressBar=(ProgressBar) findViewById(R.id.progress1);
}
//startButton-->onClick
public void startProgress(View v){
this.progress=0;
progressBarHandler.removeCallbacks(newThread);
progressBarHandler.post(newThread);
}
有關handler消息隊列的更多信息,比如怎麼給子線程添加自己的消息隊列,見http://blog.sina.com.cn/s/blog_618199e60101g4vh.html
下面的部分轉載自http://blog.sina.com.cn/s/blog_618199e60101g4vh.html
Handler並不是調用thread的start()方法,而是直接在當前線程調用thread的run()方法
晚上繼續寫,先寫到這