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

为什么Thread中的run方法没被执行,而且两次打印的Thread都是显示是main线程?我用的是android studio

package newzillion.myhandler2;

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.util.Log;

public class MainActivity extends Activity {
    private MyThread myThread;
    private Handler mHandler = new Handler(){
        @Override
        public void handleMessage(Message msg) {
            Log.i("main", "UI.Thread: " + Thread.currentThread());
        }
    };
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.content_main);
        myThread = new MyThread();
        myThread.start();
        mHandler.sendEmptyMessage(0);
        myThread.mHandler.sendEmptyMessage(0);

    }

    /**
     * Create MyThread
     */
    class MyThread extends Thread {
        private Handler mHandler = new Handler(new Handler.Callback() {
            @Override
            public boolean handleMessage(Message msg) {
                Log.i("main", "Callback MyThread,currentThread: " + Thread.currentThread());
                return false;
            }
        }) {
            @Override
            public void handleMessage(Message msg) {
                Log.i("main", "MyThread.currentThread: " + Thread.currentThread());
            }
        };

        @Override
        public void run() {
//            Create looper
            Looper.prepare();
            Log.i("mian", "Thread:" + Thread.currentThread());
            Looper.loop();
        }
    }
}

http://img1.sycdn.imooc.com//5719c33b0001ad9509660113.jpg

正在回答

2 回答

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

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

我发现好像是如果Handler在MyThread的 run方法里面实例化的话,那么handlerMessage就在MyThread 线程中执行; 如果Handler是在run方法外面实例化,handleMessage就在UI线程中执行。具体我也不清楚。

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

举报

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

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

进入课程

为什么Thread中的run方法没被执行,而且两次打印的Thread都是显示是main线程?我用的是android studio

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