2017-06-23 7 views
0

Ich habe eine Methode, die einige Daten einschließlich Koordinaten der Standorte von API herunterlädt und ein Array auffüllt. Ich rufe diese Methode in onCreate dann in onMapReady Ich rufe eine andere Methode, die die Markierungen auf Karte setzt. Ich habe nur zwei Testobjekte, die jetzt zu meiner Karte hinzugefügt werden können, so dass es nicht viel Zeit kostet, sie herunterzuladen und anzuzeigen, aber manchmal führt sie die spätere Methode aus, bevor ich die Daten heruntergeladen habe. Es zeigt also keine Markierungen.warten, bis die Methode beendet ist, dann gehen Sie auf die nächste Zeile Android

Ich habe verschiedene Ansätze wie AsyncTask versucht, aber dieser führt immer die spätere Methode, bevor die erste abgeschlossen ist.

hier ist mein Code

private class AsynchronouslyDoSomeStuff extends AsyncTask<Void, Void, Void>{ 
    @Override 
    protected Void doInBackground(Void... params) { 
     Log.v("Donkey", "Async doInBackground Called"); 
     downloadCustomersData(); 
     return null; 
    } 

    @Override 
    protected void onPostExecute(Void aVoid) { 
     super.onPostExecute(aVoid); 
     Log.v("Donkey", "Async onPostExecute Called"); 
     updateMapMarkers(); 
    } 
} 

und dann new AsynchronouslyDoSomeStuff().execute(); in onMapReady nennen, aber wie ich sagte, es funktioniert nicht.

Hinweis: Ich möchte keine Dinge wie Thread.wait(some time); verwenden, weil ich nicht weiß, wie viel Zeit es später für andere Kunden braucht.

+4

Der Code, den Sie gepostet haben, wird genau das tun, was Sie brauchen, aber nur, wenn 'downloadCustomersData()' synchron ist. Wenn es asynchron ist, wird es nicht abgeschlossen, bevor 'onPostExecute' aufgerufen wird. Es hängt wirklich alles davon ab, was 'downloadCustomersData' tut. – Kuffs

+0

@Kuffs ist es nicht möglich, synchrone Netzwerkoperationen auf dem Haupt-Thread durchzuführen. Das würde zu einer "NetworkOnMainThreadException" führen. – F43nd1r

+1

Dies ist eine AsyncTask und nicht der Haupt-Thread, daher sind Netzwerk-Operationen sowohl synchron als auch asynchron erlaubt. – Kuffs

Antwort

0

So löste ich meine Frage nach der zweiten Methode als Callback-Funktion des ersten Methode aufrufen.

und dann die erste Methode in onLocationChanged meiner Karte aufrufen.

Ich rief die zweite Methode direkt nach for-Schleife.

0

Nach meinem Kommentar oben. Eine viel einfachere (meiner Meinung nach) Methode, solche Dinge zu tun, ist das EventBus-Modell.

Bitte sehen: http://greenrobot.org/eventbus/

diese verwenden, können Sie nur Ereignisse ausgelöst, wenn Sie Ihre UI aktualisieren möchten.

0

Sie möchten eine Methode aufrufen, sobald zwei asynchrone Tasks abgeschlossen sind (onMapReady und doInBackground).

Der einfachste Weg ist das Speichern des Ergebnisses der Aufgabe, die zuerst beendet wird, und dann die Ausführung der Methode, wenn die zweite beendet ist.

z.B.


if(googleMap == null) { 
    this.customerData = customerData; 
} else { 
    setMapMarkers(customerData, googleMap); 
} 
Verwandte Themen