【问题标题】:How to set up a Handler/Looper to call requestLocationUpdates in a Service callback如何设置处理程序/循环器以在服务回调中调用 requestLocationUpdates
【发布时间】: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


    【解决方案1】:

    据我了解,您从另一个线程运行服务,不是吗? 为了使其工作,您应该在类实例化之前调用 Looper.prepare()

    【讨论】:

    • 我使用我的服务类在 Sctivity 中创建了一个 Intent,然后使用该 Intent 调用 startService()。在此之后,我的服务被置于前台,因此它完全有可能仍在运行但活动消失了。
    • 我的服务也已经在创建一个处理程序线程...但这只是处理调用 onStart 或 onStartCommand 的服务的意图...我不确定 HTTP 回调发生在哪个线程中.
    • 您应该考虑改用 HandlerThread - developer.android.com/reference/android/os/HandlerThread。或者您可能希望使用已经具有此类行为的 IntentService 来异步处理传入的 Intent:developer.android.com/reference/android/app/IntentService
    【解决方案2】:

    AndroidSync 是单线程的,因此在您实例化它的线程上设置循环器无论如何都不会起作用。在回调中,创建一个新线程,准备一个looper,然后在启动GPS引擎后,运行loop:

    final Thread t = new Thread() {
        @Override
        public void run() {
            Looper.prepare();
            gps.start((long)mint,(float)mind,sat!=0);
            Looper.loop();
         }
    };
    

    【讨论】:

      猜你喜欢
      • 2015-08-10
      • 2020-04-19
      • 2016-08-21
      • 1970-01-01
      • 2017-01-30
      • 1970-01-01
      • 1970-01-01
      • 2011-11-02
      • 1970-01-01
      相关资源
      最近更新 更多