簡體   English   中英

等待onMapReady()被調用

[英]Waiting for onMapReady() to be called

我有一個以常規方式實現的Google Map,先調用MapFragment的getMapAsync(),然后等待調用onMapReady()來提供GoogleMap實例。 在我添加代碼以等待onMapReady()之前,所有這些都可以正常工作,以確保在繼續操作之前GoogleMap實例可用。

在getMapAsync()返回和onMapReady()被調用之間有很短的時間間隔(很有意義-否則不需要異步)。 盡管在我的非正式測試中,延遲往往小於半秒,但我想處理延遲可能更長的情況。

考慮到該目標,我添加了一個簡單的等待循環以阻塞名為“ map_ready”的變量。 map_ready最初為false,並由onMapReady()設置為true。 waitForGoogleMap()方法只是簡單地循環,定期測試變量並僅在變量變為true時才返回。 這是代碼概述。

    static boolean map_ready = false;

    private void init_gmap_fragment(Activity a) {
        [...]
        MapFragment f_new = new MapFragment();
        [...]
        f_new.getMapAsync(this);
        waitForGoogleMap();
    }

    synchronized private void waitForGoogleMap() {
        while (!map_ready) {
            Log.d(LOGTAG, "Waiting for GoogleMap...");
            try {
                wait(1000);
            } catch (Exception e) { Log.d(LOGTAG, "Exception!"); }
        }
    }

    public void onMapReady(GoogleMap gmap) {
        try {
            this.gmap = gmap;
            map_ready = true;
        }
        [...]
    }

上面顯示的代碼一遍又一遍地打印出“ Waiting for GoogleMap ...”-看來,運行waitForGoogleMap()阻止了onMapReady()的調用。 如果我將對waitForGoogleMap()的調用注釋掉,它會正常運行。

我究竟做錯了什么?


UPDATE / CLARIFICATION :我認為我面臨的核心問題是我想監聽一個事件,該事件預期在與監聽器相同的線程上發生。 在這種情況下,waitForGoogleMap()正在等待事件“ onMapReady()被調用”,並且兩者都在主線程上。

我假設通過創建一個工作線程來執行諸如onMapReady()之類的回調,該工作線程執行必要的工作,然后調用主線程的Handler將回調(例如onMapReady())添加到主線程的MessageQueue中。 另外,當我從主線程調用wait()時,主線程的循環程序將借此機會從其隊列中執行另一個項目。

但顯然我錯了:-)。

底線: 如何在onMapReady()執行之前阻塞?


謝謝,巴里

PS上面是我的代碼的簡化版本。 實現OnMapReadyCallback(因此實現onMapReady()回調)的包含類實際上是單例。 使用Instance()方法創建該實例,然后通過單獨的getInstance()方法獲得該實例。 一旦工作成功,我將把對waitForGoogleMap()的調用放在getInstance()方法中。 這樣,在絕對需要之前,該應用程序不會阻止。

我究竟做錯了什么?

waitForGoogleMap()在應該調用onMapReady()的同一線程上運行,因此onMapReady()waitForGoogleMap()返回之前,才能調用waitForGoogleMap()

擺脫waitForGoogleMap() onMapReady()onMapReady()需要GoogleMap的工作。 如果需要,請使用事件總線獲取“嘿,地圖已准備好!” 事件轉移到其他組件。

暫無
暫無

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

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