我正在创建一个线程来处理请求。在线程中,我必须调用Looper.prepare(),这是它正在使用的某些其他功能所必需的,然后再调用Looper.loop()。但是,当关闭请求的连接时,我在另一个线程中得到了回调。那时我需要在线程的循环器上调用quit(),这样loop()将返回并且线程将退出。但是,我很难弄清楚如何获取该线程的循环程序。我没有在Thread中看到任何用于该线程的Looper。在Looper类中,我看到了一种获取当前类的循环程序的方法,但是我无法将此信息从Thread的内部类传递给创建它的类:

                final Looper l1;
                final Thread thread = new Thread() {
                    @Override
                    public void run() {
                        Looper.prepare();
                        l1 = Looper.myLooper(); // ERROR!
                        // initialization goes here
                        Looper.loop();
                        Log.d(logtag,"The request thread is done.");
                    }
                };
                thread.start();


并在紧接上述行的回调中:

webSocket.setClosedCallback(new CompletedCallback() {
    @Override
    public void onCompleted(Exception ex) {
        // other code
        l1.quit();
    }
});


在上面标记的行上出现编译时错误:

Cannot assign a value to final variable 'l1'.


但是我还没有分配!如果我没有将Looper设置为final,则不能将其赋值,因为它不是final。

最佳答案

这似乎有点hack,但是我创建了这个类(私有,在同一文件中):

class LooperHolder {
    Looper l1 = null;
    void setLooper(Looper looper) {
        l1 = looper;
    }
    Looper getLooper() {
        return l1;
    }
}


然后,我修改了代码以通过弯针固定器:

            final LooperHolder lh = new LooperHolder();
            final Thread thread = new Thread() {
                @Override
                public void run() {
                    Looper.prepare();
                    lh.setLooper(Looper.myLooper());
                    // initialization goes here
                    Looper.loop();
                    Log.d(logtag,"The request thread is done.");
                }
            };
            thread.start();


然后在回调中:

Looper l1 = lh.getLooper();
if (l1 != null) l1.quit();

10-07 19:31
查看更多