Probleme mit dem Timer

  • 10 Antworten
  • Letztes Antwortdatum
S

Schütz12

Neues Mitglied
0
Hallo leute!

Ich will mir eine Zeitverzögerung prorgammieren und das auch anzeigen lassen bei einer Textview. Es soll von 3 runterzählen und wenn es 1 ist soll als nächstes Start stehen.

Hier mein Programm:

import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
import java.util.Timer;
import java.util.TimerTask;



public class MainActivity extends Activity implements OnClickListener {

private Button start;
private Button cancel;
private TextView begin;
private TextView state;
public int starttimer;
public int counter=3;
private TextView textcounter;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

start = (Button)findViewById(R.id.startbutton);
start.setOnClickListener(this);
begin = (TextView)findViewById(R.id.TextView1);
begin.setText("Um zu Beginnen drücke Start");


}

public void onClick(View v)
{
if(v.getId() == R.id.startbutton)
{
setContentView(R.layout.timer);
/*cancel = (Button)findViewById(R.id.beendenbutton);
cancel.setOnClickListener(this);
state = (TextView)findViewById(R.id.textstate);
state.setText("Zustand : STOPP");*/

textcounter=(TextView)findViewById(R.id.time);

counter=3;


Timer t=new Timer();
t.schedule(task,0,1000);

return;
}
else if(v.getId()==R.id.beendenbutton)
{
setContentView(R.layout.activity_main);
start = (Button)findViewById(R.id.startbutton);
start.setOnClickListener(this);
begin = (TextView)findViewById(R.id.TextView1);
begin.setText("Um zu Beginnen drücke Start");


return;
}
}

TimerTask task = new TimerTask(){
public void run()
{

textcounter.setText(""+counter);

if(counter==1)
{
task.cancel();
textcounter.setText("Start");
//MainActivity active = new MainActivity();
//active.setviewwischen();
}

counter--;

}
};

public void setviewwischen(){

cancel = (Button)findViewById(R.id.beendenbutton);
cancel.setOnClickListener(this);
state = (TextView)findViewById(R.id.textstate);
state.setText("Zustand : STOPP");
}


@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}





}


Und hier die Fehlermeldung dazu:

Anbei
 

Anhänge

  • timer_android.JPG
    timer_android.JPG
    91,6 KB · Aufrufe: 258
Lass mich raten:
MainActivity Zeile 75 ist
Code:
textcounter.setText(""+counter);
?? ;)

Im Logcat steht doch eigentlich alles was du brauchst:
Only the original thread that created a view [...] can touch its views.

Gruß
 
Und was bedeutet das jetzt, denn ich komme auf den fehler nicht drauf :(
 
Verdammt -.-'
Hier stand mal was gutes mit Thead blbla .-
 
Zuletzt bearbeitet:
Ich rufe doch die 2 XML datei auf wo das textview enthalten ist, und solange ich diese benutze greife ich auch auf keinem anderen zu, oder sehe ich da was falsches?
 
Hä? Die XML haben damit null zu tun.
Der Timer erstellt ein neuen Thread. Das Object des TextViews wird aber im MainThread erstellt. Somit ist es im TimerThread nicht verfügbar...

€dit:
Als ich das mit den Threads gelernt habe, hat mir mal einer gesagt: "Erstelle mal eine zweite Klasse die von Timer erbt, dann verstehst du warum das nicht funktioniert..."
 
Aso ich glaube es verstehe :)

Und was ist deiner meinung nach die lösung?
 
Du musst dir also überlegen, wie du "ein signal" an den ersten Thread sendest, dass dieser das setText für dich übernimmt...

;)

Gruß

€dit: VERDAMMT!!! xDDD
 
Oke danke für deine hilfe :)
 
Keine Ahnung ob es funktioniert, aber du kannst mal im Thread dir das Layout-Inflatern und dann den Text ändern... Sollte eigentlich gehen :)

Ansonsten ist eig. der Timer ne schlechte wahl. Schau mal nach Handler und AsyncTask...

Gruß
 
Zurück
Oben Unten