如何设置处理程序/循环程序以调用请求位置服务回调中的更新



我有一个服务,它使用 com.koushikdutta.async.AsyncHttpServer 实例化 Web 服务器。 在回调中,我需要实例化一个在LocationManager上调用requestLocationUpdates的类。 但这会导致异常:

Can't create handler inside thread that has not called Looper.prepare() 

我正在尝试设置一个循环器/处理程序来摆脱此错误,但我不确定如何继续。 此示例演示如何创建创建处理程序的线程类,但不演示如何使用它。 在这个答案中,错误地声称您不能使用处理程序,但随后提供了一个链接来显示如何做到这一点,这是我改编成如下所示的一些代码:

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 之外声明它是 final,那么它告诉我我无法初始化它,因为它是 final。 但是我不能在 Runnable 之外初始化它,因为将其放在 Runnable 中的全部意义在于避免尝试调用 requestLocationUpdates 的构造函数而不是未调用 Looper.prepare(( 的线程而导致的异常。 此外,这个gps变量也需要在 Runnable 之外,因为另一个回调(在连接关闭时(需要调用它上面的另一个函数来关闭它。此外,变量必须是回调的本地变量,因为它需要在每次调用回调时单独实例化一个新对象。

我不确定我尝试设置处理程序的方式是否正确,假设是正确的,我如何克服上述问题?

据我了解,您从另一个线程运行服务,不是吗? 为了使其工作,您应该在类实例化之前调用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();
}
};

最新更新