Beiträge von nono124

    hallo eine einfache verzögerte lösung wäre in etwas so.
    Bei einem Toast musst du aber aufpassen das du auch den richtgen Context hast.



    dein alter code solte so auch laufen. nur bei dem neuen Lauf bin ich mir nicht sicher habe ich nicht gestestet.

    Wenn du nicht weist was diese Zeile in Kotlin alles macht.


    class Field (context: Context, attrs: AttributeSet)


    Solltest du dir Kotlin genauer anschauen, vor allen wie die ausführliche Schreibweise aussieht .


    In Java ist das Ganze mit getter und setter noch mehr Schreibarbeitdas hat Kotlin alles schon für dich gemacht.


    Das was in dem komprimierten Konstruktor ist sind Klassen Variablen.

    Nein du hast nicht aufgepasst den Context hast du schon wird dir in der Klasse im primer Kostrucktor mit übergeben.


    class Field (context: Context, attrs: AttributeSet): View(context, attrs)


    die abgeleitete View „Field“ hast du bestimmt in deinem Layout benutz. Und das bindest du in der Activity mittels setContentView ein und genau da wird die Instanz der Kalssse erstellt und ihr wird der Context der Activity übergeben.


    Wo du das machst bleibt dir überlassen .
    var sharedPreferences: SharedPreferences = context.getSharedPreferences("highscore",Context.MODE_PRIVATE)

    Hallo mit exit (0) beendest du die activity und somit auch die erstellten listner. Wenn der erste Lister fertig ist und das exit macht haben die anderen kein Möglichkeit mehr den Code auszuführen und die Daten in die DB zuschreiben.
    Deshalb schreiben nicht im Listen.


    Außerdem wozu brauchst du 3 oder auch 10 listner (pro User einen) wenn du es sowieso erst am Ende der regatta nach der Dialog box Abfrage machst.
    Dann kannst du zu diesen zeitbunkt die Daten in die DB schreiben.
    Es würde ein listner reichen der dir alle Daten der User holt und zwar alle die an der Regatta teil genommen haben auf einmal. Nun kannst du rechnen und jedem seine Punkte dazu zählen und wider Speichen. Mache das alles in einem listner. Danach kannst du die activity verlassen beenden.


    Oder du lässt dir etwas einfallen woran du erkennst das alle Lister fertig waren aufgerufen wurden gespeichert haben und nur dann kannst du die activity beenden.


    Da sind wir wider bei meinen schon genannten if. Was du nicht beachten wolltest.


    Denn gleich nach dem Speichen der Daten im listner beendest du die activity. Somit gaben die anderen listner keine Chance mehr dann zu kommen. Weil die activity ist nach dem ersten listner beendet. Ein berechnen der akten Punkte mit den neuen Punkten der anderen User findet dann nicht mehr statt. Da die activity beendet und alle Instanzen der listner löscht sind.

    ich denke das Problem ligt hier

    Code
    if (berechnungsZähler >= auswahlAnzahl){
                                    Map<String, Integer> sortedMap = sortByValue(unsortMap);

    in den if zweig geht er nur in einem der drei listner rein und somit wird auch nur in dem einem Listner etwas geschrieben.

    Code
    for(final Map.Entry e : zeitTabelle.entrySet()){
                    if(!e.getValue().toString().equals("00:00:00")) {
                        Log.i( "test","zeitberechnen for Schleife:"+ e.getKey());
    
    
                        //mit dem yardstick berechnen
                        mDatabase.child("users").child(e.getKey().toString()).addListenerForSingleValueEvent(new ValueEventListener() {
                            @Override
                            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {

    die die du hier erstellst. drei user sind es drei oder bei 10 user eben 10.

    Auch wenn du das Regatta abbrechen weg lest wir immer nur ein Listner aufgerufen. Die überschneiden sich.


    Entweder müssen die alle einzeln in Threads oder du macht nur einen Listner der dir alle daten der User in den dataSnapshot liefert und du kannst somit auch alle daten gleichzeitig berechnen.
    du machst das sowieso erst am ende wo alles gelaufen ist.

    Im Debugger mit einem Brake im listner geht es richtig.


    Also existiren auch die drei listner.


    Bei einem normalen durchlauf wird das Handy beschäftigt sein wenn Firebas einen Lister aufruftweil es noch in einem andern Listner ist. Somit geht die daten Übergabe ins lehre . Bein Debugger geht es langsamer und ich bekomme auchalle logs.


    Du musst dein Konzept überarbeiten.


    denke es ist jetzt genug.

    mal erlich was soll das du wisst am anfang deines Threads auf SharedPreference zugreifen. da finde ich nichts in deinem code ausser eine Klasse die von View abgelleitet wird.



    MainActivity = MainActivity()
    private var sharedPreferences: SharedPreferences = main.getSharedPreferences("highscore",Context.MODE_PRIVATE)


    war der Anfang



    Du hast in der view Klasse doch denn Kontext der activity.
    Den nimmst Du um auf die sheredpref zu zugreifen.
    Das ist Deine Instanz der activity.
    Eine neues Objekt der activity zu erstellen ist falsch. OOP