0

我正在編寫一個代碼,它從一個AsyncTask(HttpUrlConnection)開始輸入另一個AsyncTask(HttpUrlConnection),然後使用該信息將標記添加到Google地圖等待完成AsyncTask和加載地圖

我面臨的問題是,當我試圖通過onPostExecute添加標記時,地圖尚未加載。但是,當我嘗試使用onMapReady數據尚未下載。

在嘗試放置標記之前,我是否可以等待加載數據和地圖準備就緒?

+0

使用onFinished方法使用自定義偵聽器(接口),並在postExecute上調用該偵聽器。既然你需要做兩個asynks,你需要做兩次(或者只需要在同一個doInBackground中做兩次請求) – user6547359

+0

你可以爲每個「步驟完成」設置標誌,或者使用[Future](https:// developer .android.com/reference/java/util/concurrent/Future.html)for syncronicity – Bonatti

+0

@Bonatti我該怎麼做(代碼請)? –

回答

2

對SyncE問題是非常通用的,沒有提供自定義代碼,我將發佈一個 「通用的解決方案」:

boolean isStep1Done = false; 
boolean isStep2Done = false; 

private class ExampleOperation extends AsyncTask<String, Void, String> { 

    @Override 
    protected String doInBackground(String... params) { 
     Thread.sleep(1000); 
     return "Completed"; 
    } 

    @Override 
    protected void onPostExecute(String result) { 
     isStep1Done = true; 
     continueLogic(); 
    } 

    @Override 
    protected void onPreExecute() {} 

    @Override 
    protected void onProgressUpdate(Void... values) {} 
} 

同樣的事情ExampleOperation 2,在此設置isStep2Done爲true。 然後,如果它們是連續的,則可以繼續,如果它們是獨立的,則在每次調用continueLogic()時,都會檢查所有標誌。

private void continueLogic(){ 
    if(isStep1Done && isStep2Done){ 
     stuffs... 
    } 
} 
0

是什麼問題使用2個布爾值,並將其設置爲true時的數據加載與時地圖加載完成,在每個這種異步任務添加檢查,如果雙方真實然後啓動添加標記)

+0

這不是說它只檢查一次,如果不是這樣,它就完全跳過這一步。 –

+0

的事情是,你會檢查2次,每個異步任務,如果任務1將首先結束,那麼你將填寫第二個數據,如果第二個將首先結束,那麼你將填寫所有數據在第一個結束時) –

0

你可以試試遵循邏輯。

public class MyAct extends Activity implements OnMapReadyCallback { 
 

 
    private GoogleMap mMap; 
 
    private List<YourObj> mItems; 
 
    
 
    public void onMapReady(GoogleMap googleMap) { 
 
    mMap = googleMap; 
 
    populateMap(); 
 
    } 
 
    
 
    private class MyTask extends AsyncTask { 
 
    ... 
 
    protected void onPostExecute(List<YourObj> results) { 
 
     mItems = results; 
 
     populateMap(); 
 
    } 
 
    } 
 

 
    private void populateMap() { 
 
    if (mMap != null && mItems != null) { 
 
     for (YourObj o : mItems) { 
 
     mMap.addMarker(...); 
 
     } 
 
    } 
 
    } 
 
    
 
}