[Android/Firebase] Kod wykonuje się w dziwnej kolejności


(MrGalek) #1
   @Override
public void onClick(View v)
{
    wait.setVisibility(View.VISIBLE);
    addPassing.setVisibility(View.GONE);
    FirebaseDatabase database = FirebaseDatabase.getInstance();
    final DatabaseReference myRef = database.getReference("baza");

    myRef.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            numberOfTrips = dataSnapshot.child("Number of trips").getValue(Integer.class);

            myRef.child("Trips").child("ID"+String.valueOf(numberOfTrips)).child("Driver").setValue(userID);
            myRef.child("Trips").child("ID"+String.valueOf(numberOfTrips)).child("From").setValue(from.getText().toString());
            myRef.child("Trips").child("ID"+String.valueOf(numberOfTrips)).child("Where").setValue(where.getText().toString());
            myRef.child("Trips").child("ID"+String.valueOf(numberOfTrips)).child("Date").setValue(date.getText().toString());
            myRef.child("Trips").child("ID"+String.valueOf(numberOfTrips)).child("Time").setValue(time.getText().toString());
            myRef.child("Trips").child("ID"+String.valueOf(numberOfTrips)).child("Price").setValue(price.getText().toString());
            myRef.child("Number of trips").setValue(numberOfTrips++);
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    });

    Intent intent = new Intent(this, UserMain_app.class);
    startActivity(intent);

Mam taki onClick(), i dziwny problem. Mianowicie nigdy nie zwiększa mi się “Number of trips” i nie mam pojęcia. Dodatkowo jak zapiąłem breakpointa to zauważyłem że dodawanie do bazy wykonuje sie najpierw mimo że pobranie wartości jest wcześniej. Przez to wszystko dane nadpisują sie zamiast tworzyć nowe dziecko o ID1, ID2 itd.

Czy ktoś ma pomysł ?


(Fizyda) #2

Podejmę temat chociaż Android jest mi słabo znany, a Firebase to już w ogóle.
Mnie dziwi jedna rzecz (jak na razie), po co dodajesz Listenera do Firebase po kliknięciu w przycisk? Przecież metoda onDataChange w ValueEventListener wywoływana jest gdy DANE W FIREBASE ULEGNĄ ZMIANIE. Czyli jeśli po kliknięciu w przycisk nie dojdzie do zmiany stany bazy to w ogóle ta metoda się nie wykona.
Musiałbyś, albo poprzez inną aplikację, albo w innym miejscu tej aplikacji najpierw zaktualizować stan bazy by wywołać tą metodę. Dlatego moim zdaniem dodawanie/aktualizowanie w tym miejscu wartość jest słabym pomysłem. Owszem może zachodzić taka potrzeba, ale w tym konkretnym przypadku wydaje mi się to bez sensu. Nie jestem w 100% pewny, ale czy w tym przypadku nie uzyskujesz infinity-loop? Nasłuchujesz na zmiany w bazie i w tej metodzie zmieniasz dane i wracasz do początku. Taka aktualizacja miałaby sens gdybyś sprawdzał w IF czy jakieś inne dane nie zostały zmienione od których zależy stan jakiś drugich, a nie jak teraz nasłuchujesz jakichkolwiek zmian.

Na razie tyle, obroń się i wytłumacz mi moje wątpliwości bo chętnie pomogę, ale nie znam Firebase więc mogę się mylić.


(MrGalek) #3

No właśnie! Mnie też to zdziwiło (sama nazwa metody “onDataChange”, jakby wskazuje na to), ale problem w tym ze i oficjalna dokumentacja (z tego co widziałem) i Stack pokazuje tylko taki sposób pobierania danych. Sam dopiero uczę się Firebase’a i kiedy stosowałem w innych miejscach na sucho to pobieranie to działało. Sprawdzałem przed chwilą jak zachowa się po wywaleniu tego dodawania wartości i o dziwo w breakpoint wskoczył kilka sekund po tym jak już wczytał to drugie Activity. Troche to działa tak jakby było w drugim wątku, ale nie wiem dokładnie czemu tak - może to kwestia telefonu (w co wątpię).


(Fizyda) #4

No bo przycisk jest w starym activity, a nie nowym. Każde Activity to inny wątek - przynajmniej z tego co mi wiadomo.

W docu (https://firebase.google.com/docs/database/android/read-and-write) masz sekcję Read data once i to jest to co moim zdaniem potrzebujesz tutaj użyć.
Poza tym niżej masz sekcję o aktualizacji danych - o to chciałem dopytać/uczepić się później bo też mi nie pasuje jak to robisz - względem tego co wyczytałem z doca.