Handler:
主要用于异步消息的处理,发送消息和接收消息不是同时的,主要用于处理耗时比较长的代码,开始,首先介绍一下Handler的基本使用方法:
这里主要 用了匿名内部类的方法,构建了一个Handler对象和Runnable对象,handler里面有一个方法: public void handleMessage(Message msg) 主要用来获得Message对象,需要注意的是,Handler里面一共有两个对列,一个是消息队列,另一个是线程队列,在Runnable对象重写run方法里面,先获得了Message对象,接着为他赋值,然后停留一秒,将Message压入到消息对列,Handler获得消息后,显示在bar上,然后再将线程压入队列,知道i==100时,将线程从线程从线程队列中弹出,这是最简单的用法。
整体代码如下:
public class MainActivity extends Activity {
ProgressBar bar = null;
Button startBt = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
bar = (ProgressBar) findViewById(R.id.bar);
startBt = (Button) findViewById(R.id.my_bt);
startBt.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
bar.setVisibility(View.VISIBLE);
myHandler.post(runnableThread);
}
});
}
Handler myHandler = new Handler(){
@Override
//异步的,获得Message
public void handleMessage(Message msg) {
bar.setProgress(msg.arg1);
//将线程压入到线程队列中
myHandler.post(runnableThread);
}
};
Runnable runnableThread = new Runnable() {
int i = 0;
@Override
public void run() {
i = i + 10;
//得到handler的Message
Message msg = myHandler.obtainMessage();
//将msg的arg1值设置为i
msg.arg1 = i;
try {
Thread.sleep(1000);
}catch (InterruptedException e){
e.printStackTrace();
}
//只管将消息压入到消息对列中
myHandler.sendMessage(msg);
if(i == 100) {
//将线程从线程队列中弹出
myHandler.removeCallbacks(runnableThread);
}
}
};
}
注意:handler用Post方法没有开启新的线程是直接在原有的线程上调用了run方法,并没有调用它的start方法。
Bundle:所有的键都是String类型的,其值可以为其他的类型(不是Object),可以将其看成特殊的map,作为数据存储的工具。
HandlerThread可以循环处理消息,它另开了一个线程,真正的实现了异步处理。
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
HandlerThread handlerThread = new HandlerThread("handler_thread");
handlerThread.start();
//在使用handlerThread.getLooper()方法之前,必须先调用handlerThread的start方法。
MyHandler myHandler = new MyHandler(handlerThread.getLooper());
Message msg = myHandler.obtainMessage();
//作为存储对象
Bundle bundle = new Bundle();
bundle.putString("name","yanxi");
bundle.putInt("age",16);
msg.setData(bundle);
//将msg发送到目标对象,所谓的目标对象,就是生成msg的Handler对象
msg.sendToTarget();
}
private class MyHandler extends Handler{
public MyHandler(Looper looper) {
super(looper);
}
@Override
public void handleMessage(Message msg) {
System.out.println("handler-->"+Thread.currentThread().getId());
Bundle b = msg.getData();
String name = b.getString("name");
int age = b.getInt("age");
System.out.println(name + age);
}
}
}