我有一个使用com.koushikdutta.async.AsyncHttpServer实例化Web服务器的服务。在回调内部,我需要实例化一个在LocationManager上调用requestLocationUpdates的类。但这会导致异常:
Can't create handler inside thread that has not called Looper.prepare()
我正在尝试设置一个循环程序/处理程序以消除此错误,但我不确定如何继续。 This example显示了如何创建一个创建处理程序的线程类,但没有如何使用它。在this answer中错误地声明您不能使用Handler,但随后提供了一个链接来显示如何执行该操作,我修改了一些代码,使其看起来像这样:
Handler handler = new Handler();
final GPSListener gps;
handler.post(new Runnable() {
@Override
public void run() {
gps = new GPSListener(ctx,ews);
}
})
此代码位于响应HTTP请求的回调中。但是有一个紧迫的问题。除非声明为final,否则我无法在Runnable中使用gps
变量。但是,如果我在Runnable之外将其声明为final,那么它告诉我由于它是final,所以无法对其进行初始化。但是我无法在Runnable外部对其进行初始化,因为将其放入Runnable的全部目的是避免尝试构造函数尝试调用requestLocationUpdates而不是未调用Looper.prepare()的线程而导致的异常。此外,此gps
变量也需要位于Runnable外部,因为另一个回调(在连接关闭时)需要在其上调用另一个函数以关闭设备。此外,该变量必须在回调本地,因为每次调用回调时它都需要分别实例化一个新对象。
我不确定我试图设置处理程序的方式是否正确,并且假设是正确的,我该如何解决上述问题?
据我了解,您是从另一个线程运行Service的,不是吗?为了使其工作,您应该在类实例化之前调用Looper.prepare()。
AndroidSync是单线程的,因此在您实例化该线程的线程上设置一个循环程序无论如何都行不通。在回调中,创建一个新线程,准备一个循环程序,然后在启动GPS引擎之后,运行循环:
final Thread t = new Thread() {
@Override
public void run() {
Looper.prepare();
gps.start((long)mint,(float)mind,sat!=0);
Looper.loop();
}
};