0

Ich schreibe einen Code, der die Eingabe von einem AsyncTask(HttpUrlConnection) zu einem anderen AsyncTask(HttpUrlConnection) startet, die dann die Informationen verwendet, um Marker zu einer Google Map hinzuzufügen.Warten auf Abschluss der AsyncTask und Laden der Karte

Das Problem, mit dem ich konfrontiert bin, ist, dass die Karte nicht geladen wurde, wenn ich versuche, Marker über onPostExecute hinzuzufügen. Aber wenn ich versuche, onMapReady zu verwenden, sind die Daten noch nicht heruntergeladen worden.

Gibt es einen Weg, auf dem ich warten kann, bis die Daten geladen sind und die Karte bereit ist, bevor ich versuche, Marker zu platzieren?

+0

Verwenden Sie einen benutzerdefinierten Listener (Schnittstelle) mit einer onFinished-Methode, und rufen Sie diese auf postExecute auf. Da Sie zwei asynks ausführen müssen, müssen Sie dies zweimal tun (oder beide im selben doInBackground anfordern). – user6547359

+0

Sie können Flags für jeden "Schrittabschluss" setzen oder den [Future] (https: // developer .android.com/reference/java/util/concurrent/Future.html) für syncronicity – Bonatti

+0

@Bonatti Wie kann ich das tun (Code bitte) ??? –

Antwort

2

Synce die Frage ist sehr allgemein und sofern keine benutzerdefinierten Code, ich werde eine "generische Lösung" schreiben:

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) {} 
} 

Das Gleiche gilt für ExampleOperation 2, wo es setzt isStep2Done zu wahr. Dann, wenn sie sequentiell sind, können Sie fortfahren, wenn sie unabhängig sind, auf jedem Sie continueLogic() aufrufen, und der erste Schritt in dieser Funktion, überprüfen Sie für alle Flags.

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

Was ist das Problem der Verwendung 2 booleans und sie auf true gesetzt, wenn die Datenlast durchgeführt und wenn Karte Last erfolgt und in jeder dieser async Aufgaben überprüfen hinzufügen, wenn beide wahr dann Zugabe von Markern starten)

+0

Würde das nicht bedeuten, dass es nur einmal überprüft und wenn es nicht wahr ist, überspringt es den Schritt ganz. –

+0

Die Sache ist, dass Sie 2 mal und jede asynchrone Aufgabe überprüfen, wenn Aufgabe 1 zuerst endet, dann füllen Sie Daten auf dem zweiten, und wenn das zweite zuerst endet, dann füllen Sie alle Daten in das erste, wenn es endet) –

0

Sie die versuchen können, folgende Logik.

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(...); 
 
     } 
 
    } 
 
    } 
 
    
 
}