为了账号安全,请及时绑定邮箱和手机立即绑定

Handler创建在Thread的成员变量中(没有在run方法中),为什么2个输出都是main线程

class MyThread extends Thread{
   public Handler handler2 =new Handler(){
       @Override
       public void handleMessage(Message msg) {
           Log.d("sss",Thread.currentThread()+"handler2");
       }
   };
   public void run() {
       Looper.prepare();
       Looper.loop();
   }

输出

10-16 16:15:51.290 8057-8057/com.example.administrator.myapplication D/sss: Thread[main,5,main]handler2

10-16 16:15:51.290 8057-8057/com.example.administrator.myapplication D/sss: Thread[main,5,main]handler


正在回答

3 回答

这是因为你虽然是在子线程中创建的Handler,但是当Handler被创建出来的时候,子线程并没有创建出Looper,而Handler在创建的时候就会与Looper进行绑定(可以去查看源码),所以当你创建出Handler,而子线程没有Looper,所以Handler会与主线程的Looper进行绑定。(因为主线程的Looper在主线程创建出来的时候便也别创建出来)

0 回复 有任何疑惑可以回复我~

什么错误??

0 回复 有任何疑惑可以回复我~

改成这样就没问题,但是那样为什么会出错

class MyThread extends Thread{
   public Handler handler2;
   public void run() {
       Looper.prepare();
       handler2=new Handler(){
           @Override
           public void handleMessage(Message msg) {
               Log.d("sss",Thread.currentThread()+"handler2");
           }
       };
       Looper.loop();
   }
}


10-16 16:20:25.372 15508-15611/com.example.administrator.myapplication D/sss: Thread[Thread-10025,5,main]handler2

10-16 16:20:25.392 15508-15508/com.example.administrator.myapplication D/sss: Thread[main,5,main]handler


0 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消
Android面试常客Handler详解
  • 参与学习       54881    人
  • 解答问题       183    个

学Android开发,必学Handler,也是Android面试常客

进入课程

Handler创建在Thread的成员变量中(没有在run方法中),为什么2个输出都是main线程

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信