# Strings aus onEvent (Firestore) holen



## wer112 (13. Apr 2021)

Ich bin erneut auf ein großes Problem gestoßen, wo ich nicht mehr weiter weiß. Ich habe aus Firestore ein String geholt, diesen möchte aus onEvent holen und ihn in einen normalen String, der immer ganz oben in der Klasse steht laden bzw. ersetzen. Zur Überprüfung habe ich ein Toast in onEvent geschrieben und habe den rausgeholten String anzeigen lassen. Das hat auch funktioniert und konnte den String in der Datenbank lesen. sobald ich den Toast außerhalb des onEvent schreibe, wird kein Text angezeigt, da der String nicht raus aus dem onEvent kommt und in den String schreibt.

Ich möchte ja mit den Strings, die ich raushole auch arbeiten wollen. 

*Wie bekomme ich es aus dem onEvent heraus, *wo es im Class String steht?

Hier der Code:  

[CODE lang="java" title="Wo der String niocht angezeigt wird...."]


import com.google.firebase.auth.FirebaseAuth;
import com.google.firebase.firestore.DocumentReference;
import com.google.firebase.firestore.DocumentSnapshot;
import com.google.firebase.firestore.EventListener;
import com.google.firebase.firestore.FirebaseFirestore;
import com.google.firebase.firestore.FirebaseFirestoreException;


public class home extends AppCompatActivity {

    ImageButton ibtn;
    Button btn;
    ImageView view;

    TextView texthex;





    FirebaseFirestore fStore;



*String easteregg_lösung;*





    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_home);
        this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);



        fStore = FirebaseFirestore.getInstance();






        DocumentReference documentReference = fStore.collection("Lösung").document("2021");

        documentReference.addSnapshotListener(this, new EventListener<DocumentSnapshot>() {



            @Override
            public void onEvent(@Nullable DocumentSnapshot value, @Nullable FirebaseFirestoreException error) {
*easteregg_lösung = (String) value.getString("2021");*




            }

        });

* Toast.makeText(getApplicationContext(), easteregg_lösung, Toast.LENGTH_SHORT).show();*


    }





}[/CODE]


Und jetzt, wo der String erfolgreich angezeigt wird, was aus der Datenbank geholt wurden ist....




[CODE lang="java" title="Ihr wird der Text angezeigt..." highlight="84"]
import com.google.firebase.auth.FirebaseAuth;

import com.google.firebase.firestore.DocumentReference;

import com.google.firebase.firestore.DocumentSnapshot;

import com.google.firebase.firestore.EventListener;

import com.google.firebase.firestore.FirebaseFirestore;

import com.google.firebase.firestore.FirebaseFirestoreException;



public class home extends AppCompatActivity {


    ImageButton ibtn;

    Button btn;

    ImageView view;


    TextView texthex;






    FirebaseFirestore fStore;




*String easteregg_lösung;
*







    @Override

    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_home);

        this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);






        fStore = FirebaseFirestore.getInstance();







        DocumentReference documentReference = fStore.collection("Lösung").document("2021");


        documentReference.addSnapshotListener(this, new EventListener<DocumentSnapshot>() {




            @Override

            public void onEvent(@Nullable DocumentSnapshot value, @Nullable FirebaseFirestoreException error) {

*  easteregg_lösung = (String) value.getString("2021");

                Toast.makeText(getApplicationContext(), easteregg_lösung, Toast.LENGTH_SHORT).show();*


            }


        });

    }


}[/CODE]



Es wäre schön, wenn ihr es hinbekommt, das ich mit den Strings weiter arbeiten kann.



*Ich danke euch im Vorraus! *


----------



## mihe7 (13. Apr 2021)

Die Sache ist, dass
a) ein Event nun einmal asynchron auftritt,
b) Du Dein UI nicht blockieren darfst.

Insofern arbeiten a) und b) perfekt zusammen. Du speicherst den Wert auch außerhalb des Events. Du kannst nur nicht einfach den Toast unmittelbar nach der Registrierung des Listeners aufrufen, sondern musst eben auf das Ereignis warten.

Vielleicht mal etwas bildlicher: Du bestellst war im Internet, das ist sozusagen ein Request oder ein Methodenaufruf. Jetzt ist es nicht so, dass Du Dich Tag und Nacht vor die Tür setzt und auf das Paket wartest. Vielmehr ist die Bestellung raus und Du weißt, irgendwann wird der Postbote klingeln. Auf dieses Ereignis reagierst Du, indem Du zur Tür gehst und das Paket entgegennimmst und dann z. B. auspackst - wunderbar.

Dein Code macht folgendes: Bestellung rausschicken, zur Tür gehen und ein nicht vorhandenes Paket auspacken. Drei Tage später kommt der Postbote. Das funktioniert natürlich so nicht.


----------



## wer112 (13. Apr 2021)

mihe7 hat gesagt.:


> Die Sache ist, dass
> a) ein Event nun einmal asynchron auftritt,
> b) Du Dein UI nicht blockieren darfst.
> 
> ...


Wie funktioniertes dannn? Ein Programm arbeitet nach der Reihe. Wenn ich erst den String hole und dann es angezeigt haben möchte, wie kann ich es anzeigen bzw. wann kann ich den Postboten anschauen? Ein Programm arbeitet ziehmlich schnell...


----------



## mihe7 (13. Apr 2021)

Der Aufruf von onEvent durch Firestore ist das Klingeln des Postboten und der Code in onEvent ist Deine Reaktion darauf. Du kannst aus dem Event heraus auch andere Methoden Deiner Klasse aufrufen, Berechnungen durchführen oder eben auch etwas anzeigen lassen. Das hast Du vorhin mit dem Toast ja auch schon gemacht


----------

