【发布时间】:2020-01-10 12:00:23
【问题描述】:
我有一个使用com.koushikdutta.async.AsyncHttpServer 实例化网络服务器的服务。在回调中,我需要实例化一个在 LocationManager 上调用 requestLocationUpdates 的类。但这会导致异常:
Can't create handler inside thread that has not called Looper.prepare()
我正在尝试设置一个循环器/处理程序来消除此错误,但我不确定如何继续。 This example 展示了如何创建一个创建处理程序的线程类,但没有展示如何使用它。在this answer 中错误地声称您不能使用处理程序,但随后提供了一个链接来显示如何做到这一点,这是一些我已经修改为如下所示的代码:
Handler handler = new Handler();
final GPSListener gps;
handler.post(new Runnable() {
@Override
public void run() {
gps = new GPSListener(ctx,ews);
}
})
此代码位于响应 HTTP 请求的回调中。但是有一个直接的问题。我不能在 Runnable 中使用 gps 变量,除非它被声明为 final。但是如果我在 Runnable 之外声明它是最终的,那么它会告诉我我不能初始化它,因为它是最终的。但是我不能在 Runnable 之外对其进行初始化,因为将其放入 Runnable 的全部目的是避免由于尝试调用 requestLocationUpdates 而不是未调用 Looper.prepare() 的线程而导致的异常。此外,这个gps 变量也需要在 Runnable 之外,因为另一个回调(在连接关闭时)需要调用另一个函数来关闭它。此外,该变量必须是回调的本地变量,因为它需要在每次调用回调时单独实例化一个新对象。
我不确定我尝试设置处理程序的方式是否正确,假设正确,我该如何解决上述问题?
【问题讨论】:
标签: java android handler android-looper