Ich benutze Google Firebase-Datenbank in Android. Ich brauche zwei, um zwei Datensätze aus der Datenbank abzurufen - userInfo und assignInfo. Dann muss ich sie kombinieren und die Daten in einer Recycler-Ansicht anzeigen. Was ist der beste Weg, um dies zu erreichen? Da das Abrufen von Daten asynchron ist, wird dies unübersichtlich.

Eine Möglichkeit, die ich mir vorstellen kann, ist, den Erfolg beider asynchroner Funktionen zu überprüfen, wenn andere abgeschlossen sind. Wenn ja, holen Sie sich die Daten, kombinieren und initialisieren Sie den Adapter. Ist das der beste Weg das zu tun?

0
Nithin 19 Apr. 2018 im 19:51

3 Antworten

Beste Antwort

Ich habe diese Art von Problem gelöst, als ich etwas aus einer Datenbank herunterladen musste, bevor ich mich beim Benutzer in die App einloggte. Damit habe ich dieses Problem behoben.

Um ObservableInteger zu verwenden, können Sie dies tun

Deklariere es zuerst

private ObservableInteger mObsInt;

In Ihrem onCreate wartet dann ein Listener darauf, dass sich die Werte von mObsInt ändern. Nachdem sich diese Werte geändert haben, können Sie alles tun, was Sie wollen

//Listener
        mObsInt = new ObservableInteger();
        mObsInt.set(0);

        mObsInt.setOnIntegerChangeListener(new OnIntegerChangeListener()
        {
            @Override
            public void onIntegerChanged(int newValue)
            {
                if (mObsInt.get()==1)
                   //Do something if the first asyncTask finishes
                if (mObsInt.get()==2){
                   //Do something if the second asyncTask finishes, in this case i just go to another activity when both asyncTasks finish
                    Intent mainIntent = new Intent().setClass(LoginActivity.this, Principal.class);
                    startActivity(mainIntent);
                    finish();
                }
            }
        });

Also, wie es funktioniert

ObservableInteger wird nach Änderungen in der Variablen mObsInt suchen. Wenn also mObsInt gleich 1 ist, wird etwas getan, wenn gleich 2 ist, wird etwas anderes getan, also Dieses Problem mit 2 zu lösen asynctasks ist einfach, wenn einer der asynctasks beendet mObsInt gleich 1 ist, wenn der andere asyncTask so endet mObsInt Sei mObsInt++, und dann ist dein mObsInt gleich 2, der Listener wartet auf die Werte und macht dann, was du willst, wenn die Werte mit deiner if-Anweisung am {{X10 übereinstimmen }} Methode

Jetzt, nur in Ihren Asynctasks, geben Sie diese Zeile in Ihre onPostExecute () -Methode ein

mObsInt.set(mObsInt.get()+1);

Wenn also der erste asynchrone Abschluss mObsint == 1 ist, wenn der zweite mObsInt == 2 beendet, und dann behandeln Sie, was Sie in Ihrer onCreate-Methode tun möchten

Hoffe das hilft dir, es hat mir geholfen

Weitere Informationen erhalten Sie in diesem Dokument: https://developer.android.com /reference/android/databinding/ObservableInt.html

Viel Spaß beim Codieren!

1
Gastón Saillén 19 Apr. 2018 im 17:16

Dies kann mithilfe einer einfachen Variablen erreicht werden, die inkrementiert wird oder ein Flag behält, wenn beide Daten zum Zusammenführen und erfolgreichen Zurückgeben von Firebase verfügbar sind. Dies ist jedoch weder der beste Ansatz noch funktioniert er ständig, da er fehlschlagen kann, wenn beide asynchronen Threads gleichzeitig versuchen, das Flag zu aktualisieren. Dann funktioniert die oben angegebene Implementierung nur, wenn Sie die gesamte Operation threadsicher machen können.

Wenn Sie erwägen, eine thread-sichere Implementierung selbst zu erstellen, ist dies auch nicht so schwierig. Sie können auch eine Synchronized -Funktion verwenden, die das Flag aktualisiert, das Sie behalten, um festzustellen, ob beide Daten von der Firebase abgerufen werden.

Ich würde jedoch vorschlagen, Ihre Implementierung mit einem LocalBroadcastReceiver durchzuführen. Welches ist einfacher zu implementieren und dies ist eine Android-Lösung. Obwohl es auch einige andere Ansätze gibt, die ebenfalls großartig sind, denke ich, dass die Implementierung mit BroadcastReceiver Ihren Zweck voll erfüllen wird.

Sie können diese Antwort überprüfen, um die Implementierung eines BroadcastReceiver zu überprüfen. Wenn der erste Teil der Daten aus der Firebase abgerufen wird, senden Sie die Sendung, die von BroadcastReceiver in Ihrem Activity empfangen werden soll, und legen Sie einen Flag-Wert fest, z. B. 1. Wenn der zweite Teil empfangen wird, Sie müssen den Wert erneut auf 2 setzen, indem Sie nur die Sendung senden, wenn Sie eine Antwort von Firebase erhalten. Wenn der Wert 2 gefunden wird, bedeutet dies, dass beide Vorgänge abgeschlossen sind und Sie nun die beiden Listen zusammenführen können.

Um den gesamten Aufwand für die Thread-sichere und fehlgeschlagene Sicherheitscodierung zu vermeiden, können Sie die Daten synchron aus der Firebase abrufen. Starten Sie beim Abrufen der Daten für den ersten Teil den Abrufvorgang für den zweiten Teil, um die Kontrolle über Ihren Code zu verbessern.

Ich habe gerade einige Ideen eingebracht und eine ausgewählt, die zu Ihnen passt. Hoffentlich hilft das!

0
Reaz Murshed 19 Apr. 2018 im 17:07

Der einfachste Weg, den ich in Projekten ohne Rx / Coroutines / anderes Zeug verwende. Erstellen Sie einfach AtomicInteger. Init it with value entspricht der Anzahl der asynchronen Operationen. Rufen Sie dann in jedem Rückruf Ihrer asynchronen Funktionen Folgendes auf:

if(counter.decrementAndGet == 0) { your_final_action}.

Wenn Sie Hilfe auf andere Weise benötigen, wie ich bereits erwähnt habe, können Sie mich gerne fragen.

0
Anton Kazakov 19 Apr. 2018 im 17:16