一、Handler与线程
public class HandlerActivity extends Activity{
private Handler handler = new Handler();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
//在设置布局文件之前先调用post方法,表示在执行完主线程之后才会显示布局文件的内容,而线程中又设置了休眠3秒,所以最终表示先显示应用程序主界面,等待3秒之后才显示布局文件中的内容
handler.post(r);
System.out.println("activityId ---> " + Thread.currentThread().getId());
System.out.println("activityName ---> " + Thread.currentThread().getName());
}
Runnable r = new Runnable() {
@Override
public void run() {
//如果这里输出的当前现场的Id和Name与上面onCreate方法中输出的Id、Name相同,表示他们使用同一个线程
System.out.println("handlerId ---> " + Thread.currentThread().getId());
System.out.println("handlerName ---> " + Thread.currentThread().getName());
try {
Thread.sleep(3000);//让线程休眠3秒
} catch (InterruptedException e) {
e.printStackTrace();
}
}
};
}
根据测试证明,他们使用的是同一个线程。
activityId ---> 1
activityName ---> main
handlerId ---> 1
handlerName ---> main
如果,将onCreate中的代码改正如下,又会发生不同的结果
//andler.post(r);
Thread t = new Thread();
t.start();
activityId ---> 1
activityName ---> main
handlerId ---> 8
handlerName ---> Thread-8
二、Bundle的用法
public class BundlerTest extends Activity{
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
System.out.println("activityName ---> " + Thread.currentThread().getName());
//Looper对象很少去创建,因为Android的框架当中提供了HandlerThread类,提供了循环处理消息的功能
//生成一个handlerThead对象,实现了使用Looper来处理消息队列的功能,这个类由Android应用程序框架提供
HandlerThread handlerThead = new HandlerThread("headler_thread");//新线程的名称
//在使用handlerThead.getLooper()方法之前,必须执行start,否则返回null
handlerThead.start();
MyHandler myHandler = new MyHandler(handlerThead.getLooper());
Message msg = myHandler.obtainMessage();
//sendToTarget表示发送到目标,目标就是由哪一个Handler获得的消息,就发送给哪一个Handler,也就会调用Handler的handleMessage方法
msg.sendToTarget();
}
class MyHandler extends Handler{
public MyHandler() {
}
//带有looper参数的构造函数,表示当前的Handler使用Looper所在的线程处理消息队列
//把这个Handler(myHandler)绑定在另一个线程上,从消息队列中取消息
public MyHandler(Looper looper){
super(looper);
}
@Override
public void handleMessage(Message msg) {
System.out.println("handlerName ---> " + Thread.currentThread().getName());
}
}
}
上面的程序公有两个线程,一个是Activity(ActivityName ---> "main"),另一个是HandlerThread(ThreadName ---> "handler-thread")
三、在新线程当中处理消息的方法
b.putString("name", "zhangsan");
b.putInt("age", 12);
msg.setData(b);
int age = b.getInt("age");
String name = b.getString("name");