作者:sundroid
个人站点:sundroid.cn 邮箱: hfutsnjc@163.com 微博:http://weibo.com/Sundroid
Handler和Message是android系统中各线程之间的一种通信机制。android系统本身是遵循单线程模型的,当程序启动时,系统会同时启动一个对应的主线程负责处理这个程序中与UI相关的事件,当遇到一些比较耗时的操作时,应该在子线程中进行操作。但是如果子啊子线程中来更新UI对象,则会遇到一场:CalledFromWrongThreadException。
正确的做法是在子线程发出Message,然后由Handler获取到之后,进行UI操作,这也就表示可以将Handler理解为Message的主要处理者,负责其发送与执行处理,下面是例子展示。
package cn.sundroid.androidreview;
import android.os.Handler;
import android.os.Message;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.widget.ProgressBar;
import android.widget.Toast;
public class MainActivity extends ActionBarActivity {
private ProgressBar progressBar;
private int progress=0;
//结束
private final static int PROGRESS_END = -1;
//开始
private final static int PROGRESS_START = 0;
//建立handler对象
private Handler handler = new Handler(){
@Override
public void handleMessage(Message msg) {
switch (msg.what){
case PROGRESS_END:
Toast.makeText(getApplicationContext(),"Loading finished",Toast.LENGTH_SHORT).show();
case PROGRESS_START:
Toast.makeText(getApplicationContext(),"Loading start",Toast.LENGTH_SHORT).show();
default:
progressBar.setProgress(msg.what);
}
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
progressBar = (ProgressBar) findViewById(R.id.progressBar);
startProgress();
}
private void startProgress() {
//新建一个线程执行计数操作
new Thread(new Runnable() {
@Override
public void run() {
while (progress<100){
try {
//线程休眠0.1秒
Thread.sleep(100);
countProgress();
progress++;
} catch (InterruptedException e) {
e.printStackTrace();
}
}
endProgress();
}
}).start();
}
private void endProgress() {
//获取message对象
Message message = Message.obtain();
//将用户自定义的消息code发送给Message对象
message.what = PROGRESS_END;
handler.sendMessage(message);
}
private void countProgress() {
Message message = Message.obtain();
message.what = progress;
handler.sendMessage(message);
}
}