Timer + setText funktioniert nicht

Status
Für weitere Antworten geschlossen.
znieh99

znieh99

Fortgeschrittenes Mitglied
12
Hallo Forum,
ich mache meine ersten Schritte mit Android und versuche eine Timer-Funktion zu programmieren, welche nach einem Button-Klick mit 3 Sekunden Verzögerung einen Wert in einem TextView ausgibt welcher immer um 1 erhöht wird.
Das Ergebnis nach dem ersten Klick ist, dass der Emulator "Unfortunately, TestTimer has stopped." ausgibt und die Konsole folgende Meldungen:
at android.widget.TextView.setText(TextView.java:4174)
at com.example.heinz.testtimer.MainActivity.showWert(MainActivity.java:28)
at com.example.heinz.testtimer.MainActivity$RunTimer.run(MainActivity.java:38)
at java.util.Timer$TimerImpl.run(Timer.java:284)
01-20 08:52:12.320 4437-4456/com.example.heinz.testtimer E/Surface: getSlotFromBufferLocked: unknown buffer: 0xb4016b40

Ich habe im Code die Zeilen 28 und 38 gekennzeichnet.
Code:
package com.example.heinz.testtimer;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;
import android.widget.TextView;

import java.util.Timer;
import java.util.TimerTask;

public class MainActivity extends AppCompatActivity {
    Timer timer;
    int wert;
    public TextView tx;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        setTitle("Test Position anzeigen");
        timer = new Timer();
    }

    public void showWert() {
        wert += 1;
        tx = (TextView) findViewById(R.id.text_feld_name);
        tx.setText(String.valueOf(wert));                   //Zeile 28
    }

    public void onClickStartTim(View view) {
        timer.schedule (new RunTimer(), 5000);
//        showWert();

    }
    class RunTimer extends  TimerTask {
        public void run() {
            showWert();                                     //Zeile 38
        }
    };
}
 
Hallo Heinz,

du kannst aus einem Thread keine UI Elemente direkt ansprechen.
(In deinem Falle die Funktion showWert() , der dann auf UI TextView zugreifft)

Das müsste dir aber auch AS als Begründung ein paar Zeilen über deinem ErrorLog von oben
mitgeteilt haben.

Schau mal hier
Communicating with the UI Thread | Android Developers


runOnUiThread(new Runnable() {

@override
public void run()
{
showWert();
}

Ausserdem würde ich dir empfehlen, tx in onCreate zu ermitteln und die Deklarationen auf private zu setzen
 
Zuletzt bearbeitet:
swa00 schrieb:
Hallo Heinz,

du kannst aus einem Thread keine UI Elemente direkt ansprechen.
(In deinem Falle die Funktion showWert() , der dann auf UI TextView zugreifft)

Das müsste dir aber auch AS als Begründung ein paar Zeilen über deinem ErrorLog von oben
mitgeteilt haben.

Schau mal hier
Communicating with the UI Thread | Android Developers




Ausserdem würde ich dir empfehlen, tx in onCreate zu ermitteln und die Deklarationen auf private zu setzen
Danke für die Hinweise Stefan,
ich habe mir das durchgelesen, verstehe nun einiges mehr und habe folgende für diesen Fall funktionierende Lösung gefunden.
Aber eigentlich möchte ich, dass aus dem Timer-Task eine Methode aus dem Ui-Task aufgerufen wird und diese dann für diverse UI-Änderungen zuständig ist.

Code:
package com.example.heinz.testtimer;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;
import android.widget.TextView;

import java.util.Timer;
import java.util.TimerTask;
public class MainActivity extends AppCompatActivity {
    Timer timer;
    int wert;
    private TextView tx;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        setTitle("Test Position anzeigen");
        timer = new Timer();
        tx = (TextView) findViewById(R.id.text_feld_name);
    }

    public void showWert() {
        wert += 1;
        tx.setText(String.valueOf(wert));
    }

    public void onClickStartTim(View view) {
        timer.schedule (new RunTimer(), 3000);

    }
    class RunTimer extends  TimerTask {
        public void run() {
            tx.post(new Runnable() {
                public void run() {
                    wert += 1;
                    tx.setText(String.valueOf(wert));
                }
            });
        }
    }
}
 
Zuletzt bearbeitet von einem Moderator:
Bearbeitet von: hagex - Grund: Zitat wegen Threadmerge eingefügt, Gruß von hagex
HINWEIS :

Heinz, da du diese Frage zweimal abgeschickt hast ,lassen wir diesen hier Ruhen und machen in dem Anderen weiter
 
Zuletzt bearbeitet:
  • Danke
Reaktionen: hagex
Status
Für weitere Antworten geschlossen.

Ähnliche Themen

SaniMatthias
Antworten
19
Aufrufe
941
swa00
swa00
O
Antworten
15
Aufrufe
2.952
ORHUX
O
K
Antworten
3
Aufrufe
1.164
Kapikalaani
K
Zurück
Oben Unten