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
1.Message
2.MessageQueue
3.Looper
4.Handler
Handler并不是调用thread的start()方法,而是直接在当前线程调用thread的run()方法
晚上继续写,先写到这