簡體   English   中英

如何設置處理程序/循環程序以在服務回調中調用 requestLocationUpdates

[英]How to set up a Handler/Looper to call requestLocationUpdates in a Service callback

我有一個使用com.koushikdutta.async.AsyncHttpServer實例化 Web 服務器的服務。 在回調中,我需要實例化一個在 LocationManager 上調用 requestLocationUpdates 的類。 但這導致了異常:

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

我正在嘗試設置一個循環程序/處理程序來擺脫這個錯誤,但我不確定如何繼續。 這個例子展示了如何創建一個線程類來創建一個處理程序,但沒有展示如何使用它。 這個錯誤地聲稱您不能使用 Handler 但隨后提供了一個鏈接來展示如何做到這一點的答案中,我已經修改了一些代碼,如下所示:

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,那么它會告訴我我無法初始化它,因為它是最終的。 但是我不能在 Runnable 之外初始化它,因為將它放在 Runnable 中的重點是避免嘗試構造函數嘗試調用 requestLocationUpdates 而不是一個沒有調用 Looper.prepare() 的線程引起的異常。 此外,這個gps變量也需要在 Runnable 之外,因為另一個回調(在連接關閉時)需要調用另一個函數來關閉它。 此外,該變量必須是回調的本地變量,因為每次調用回調時它都需要單獨實例化一個新對象。

我不確定我嘗試設置處理程序的方式是否正確,假設是正確的,我該如何解決上述問題?

據我了解,您是從另一個線程運行 Service 的,不是嗎? 為了使其工作,您應該在類實例化之前調用Looper.prepare()

AndroidSync 是單線程的,因此在實例化它的線程上設置循環器無論如何都不會起作用。 在回調中,創建一個新線程,准備一個looper,然后在啟動GPS引擎后,運行循環:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM