我有一个class扩展到Thread如下-

public class ThreadTest extends Thread {

    private Handler handler;
    private Runnable runnable;

    public ThreadTest(Runnable runnable, Handler handler) {

        this.handler = handler;
        this.runnable = runnable;
    }

    @Override
    public void run() {
        super.run();

        Message msg = handler.obtainMessage();
        msg.obj = "YUSSSSSS!";
        handler.sendMessage(msg);

        if (Looper.myLooper() != null) {
            Looper.myLooper().quit();
            Log.i("Looper", "has been quit");
        }

    }
}


现在,我希望在该线程上附加一个looper。根据我对Looper的理解,默认情况下,只有主线程会附加一个looper

我尝试像这样调用Looper.prepare()Looper.loop()形成ThreadTest类的构造函数-

public ThreadTest(Runnable runnable, Handler handler) {

        Looper.prepare();

        this.handler = handler;
        this.runnable = runnable;

        Looper.loop();
    }


但是,我在java.lang.RuntimeException: Only one Looper may be created per thread处出现Looper.prepare();异常。

同时,如果我将looper附加在Run()中,则不会遇到任何问题。

我究竟做错了什么?

最佳答案

每个线程都有一个弯针,并且只有一个弯针,在尝试向线程中添加弯针之前,您需要进行检查。

您还需要在构造函数中添加if (Looper.myLooper() != null) {}
请记住,如果在线程构造函数中调用looper.myLooper(),则只能获取主线程循环器。因为那时新线程尚未构建。

关于java - 在线程的构造函数中调用Looper.prepare()会导致RunTimeException,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46432044/

10-12 22:03