我正在创建一个线程来处理请求。在线程中,我必须调用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();