看了一些博客,自己还没看源码。
一.首先系统会默认给主线程初始化一个Looper,然后在主线程新建Handler对象时,可以用无参构造函数。
如下面
public class MainActivity extends AppCompatActivity {
Handler handler=new Handler(){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
switch (msg.what){
case 1:
Toast.makeText(MainActivity.this,"handler toast!1",Toast.LENGTH_SHORT).show();
break;
case 2:
Toast.makeText(MainActivity.this,"handler toast!2",Toast.LENGTH_SHORT).show();
break;
case 3:
Toast.makeText(MainActivity.this,"handler toast!3",Toast.LENGTH_SHORT).show();
break;
default:
break;
}
}
};
二.在子类新建Handler对象,并实现handleMessage方法
new Thread(new Runnable() {
@Override
public void run() {
Looper.prepare();//Looper初始化
//Handler初始化 需要注意, Handler初始化传入Looper对象是子线程中缓存的Looper对象
mHandler = new Handler(Looper.myLooper()){
// mHandler = new Handler(Looper.getMainLooper()){ //这句话也能用
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
Toast.makeText(MainActivity.this,"DA",Toast.LENGTH_SHORT).show();
}
};
Looper.loop();//死循环
//注意: Looper.loop()之后的位置代码在Looper退出之前不会执行,(并非永远不执行)
}
}).start();
new Thread(){
@Override
public void run() {
super.run();
try {
Thread.currentThread().sleep(3000);
mHandler.sendEmptyMessageDelayed(1, 3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}.start();
三.Handler在哪个线程创建的,就运行在哪个线程里面,每一个Handler都会有唯一一个Looper与之绑定。