Jetzt kostenlos registrieren. Mitglieder surfen ohne Werbung auf Android-Hilfe.de!
Zurück   Android-Hilfe.de > Android Developer > Android App Entwicklung

Zugriff von Ticker/Timer-Klasse auf TextView-Objekt

Das Thema "Zugriff von Ticker/Timer-Klasse auf TextView-Objekt" befindet sich unter Android App Entwicklung auf Android-Hilfe.de.


Antwort

 

Themen-Optionen Ansicht
Alt 05.08.2011, 15:44   #1 (permalink)
Neuer Benutzer

Modell: HTC Desire HD

Registriert seit: 05.08.2011
Beiträge: 8
Abgegebene Danke: 0
Erhielt 0 Danke für 0 Beiträge
Standard Zugriff von Ticker/Timer-Klasse auf TextView-Objekt

Hallo!

Ich portiere derzeit einen von mir in Java entwickelten Prüfungssimulator auf Android - funktioniert soweit eigentlich auch gut.

Derzeit habe ich mit der Umsetzung eines Timers ein wenig Probleme. Der Timer wird in der Software verwendet, um ein festgelegtes Zeitlimit herunter zu zählen. Es ist also ein Timer, mit einem TimerTask, der einen Zähler sekündlich heruntersetzt und ein TextLabel neu beschriftet.

In Android soll er natürlich das gleiche mit einem TextView machen. Das Problem ist, dass ich da irgendwo wahrscheinlich ein Rechteproblem habe. Mittels Log.d(tag, msg) kann ich die Texte ausgeben, aber nicht auf das TextView anwenden. Nach einer Textänderung bricht das Programm ab, im Debug finde ich auch nichts.

Anbei der Quellcode:

Code:
import java.util.Timer;
import java.util.TimerTask;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.ScrollView;
import android.widget.TextView;
import android.widget.Toast;

public class frage extends Activity {
    
    //Klassen-Tag generieren
    private static final String tag = "frage";
    private questionCatalog catalog;
    
    //Timer-Variablen
    private int mins, secs, tempTime;
    Timer ticker;            //Countdown-Ticker Timer
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        
        //Layout setzen und Intent-Extras beziehen
        setContentView(R.layout.frage);
        final Bundle extras = getIntent().getExtras();
        
        //Wenn ein Dateiname übertragen wurde, diesen Loggen und einen Fragenkatalog instanzieren
        if(extras != null && extras.getString("dateiname").length() > 0) {
            Log.d(tag, "Got filename (" + extras.getString("dateiname") + ") from previous activity.");
            catalog = new questionCatalog(extras.getString("dateiname"));
        }
        else
        {
            Log.d(tag, "Got no file name");
            Toast.makeText(this, "Keine Datei", Toast.LENGTH_LONG).show();
            this.finish();
        }
        
        //Elemente deaktiveren, damit sie später dynamisch aktivieren werden können
        ScrollView  radGrp = (ScrollView) findViewById(R.id.scr_frageRad);
        radGrp.setVisibility(View.GONE);
        ScrollView  chkGrp = (ScrollView) findViewById(R.id.scr_frageChk);
        chkGrp.setVisibility(View.GONE);
        //TextView timer = (TextView) findViewById(R.id.txt_zeit);    
        //timer.setVisibility(100);
        
        //Timer instanzieren und starten
        ticker = new Timer();
        ticker.schedule(new Ticker(10*60), 0, 1000);
        
    }
    
    
    
    class Ticker extends TimerTask
    /* Ticker-Task zum Runterzaehlen der Zeit */
    {
        
        //Variablendeklarationen
        private int seconds;
        private TextView testObj = (TextView) findViewById(R.id.txt_zeit);
        
        Ticker(int seconds)
        /* Konstuktor */
        { this.seconds = seconds; }
        
        public void run()
        /* Hauptprozedur */
        {
            //Verbleibende Zeit formatiert ausgeben --> Anzahl der verbleibenden Minuten beziehen
            //tempTime = seconds/60;
            
            //Verbleibende Minuten (+Sekunden) setzen, falls vorhanden
            /*if(tempTime != 0)
            {
                mins = tempTime;
                secs = seconds - (mins*60);
            }
            else
            {
                mins = 0;
                secs = seconds;
            }*/
            
            //Log.d("bla", temp.getText().toString());
            
            //Zeit ausgeben, bei weniger als 10 Sekunden 0 voranstellen
            /*if(secs < 10) { temp.setText(mins + ":" + "0" + secs); }
            else { temp.setText(mins + ":" + secs); }*/
            
            testObj.setText(testObj.getText() + ".");
            
            //Sekunden verringern
            //seconds--;
        }
    }

}
Ich sehe wahrscheinlich einfach den Wald vor lauter Bäume nicht mehr. Vielleicht weiß ja einer von Euch Rat.

Danke Euch im Voraus.

Grüße!
stdevel ist offline   Mit Zitat antworten
Alt 05.08.2011, 16:48   #2 (permalink)
Neuer Benutzer

Modell: HTC Desire HD

Registriert seit: 05.08.2011
Beiträge: 8
Abgegebene Danke: 0
Erhielt 0 Danke für 0 Beiträge
Standard AW: Zugriff von Ticker/Timer-Klasse auf TextView-Objekt

Hallo,

es scheint, ich habe das Problem selbst gelöst.

Das Problem ist - dass TimerTasks unter Android nicht die korrekte Wahl für mein Problem ist. Laut den folgenden Webseiten macht ein Handler mehr Sinn:

Und siehe da - so funktioniert das Ganze.

Der überarbeitete Quellcode lautet wie folgt (falls einer das Problem nachvollziehen und ggf. nachbauen möchte):

Code:
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.util.Log;
import android.view.View;
import android.widget.ScrollView;
import android.widget.TextView;
import android.widget.Toast;

public class frage extends Activity {
    
    //Klassen-Tag generieren
    private static final String tag = "frage";
    private questionCatalog catalog;
    
    //Timer-Variablen
    private int seconds, mins, secs, tempTime;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        
        //Layout setzen und Intent-Extras beziehen
        setContentView(R.layout.frage);
        final Bundle extras = getIntent().getExtras();
        
        //TextView, Handler und Runnable instanzieren
        final TextView timer = (TextView) findViewById(R.id.txt_zeit);
        final Handler mHandler = new Handler();
        final Runnable mUpdateTimeTask = new Runnable() {
               public void run() {

                   //Verbleibende Zeit formatiert ausgeben --> Anzahl der verbleibenden Minuten beziehen
                   tempTime = seconds/60;
                   
                   //Verbleibende Minuten (+Sekunden) setzen, falls vorhanden
                   if(tempTime != 0)
                   {
                       mins = tempTime;
                       secs = seconds - (mins*60);
                   }
                   else
                   {
                       mins = 0;
                       secs = seconds;
                   }
                   
                   //Zeit ausgeben, bei weniger als 10 Sekunden 0 voranstellen
                   if(secs < 10) { timer.setText(mins + ":" + "0" + secs); }
                   else { timer.setText(mins + ":" + secs); }
                    
                    //Sekunden verringern
                    seconds--;
                   
                   //Handler in 1 Sekunden neustarten
                   mHandler.postDelayed(this, 1000);
               }
            };
        
        //Wenn ein Dateiname übertragen wurde, diesen Loggen und einen Fragenkatalog instanzieren
        if(extras != null && extras.getString("dateiname").length() > 0) {
            Log.d(tag, "Got filename (" + extras.getString("dateiname") + ") from previous activity.");
            catalog = new questionCatalog(extras.getString("dateiname"));
        }
        else
        {
            Log.d(tag, "Got no file name");
            Toast.makeText(this, "Keine Datei", Toast.LENGTH_LONG).show();
            this.finish();
        }
        
        //Elemente deaktiveren, damit sie später dynamisch aktivieren werden können
        ScrollView  radGrp = (ScrollView) findViewById(R.id.scr_frageRad);
        radGrp.setVisibility(View.GONE);
        ScrollView  chkGrp = (ScrollView) findViewById(R.id.scr_frageChk);
        chkGrp.setVisibility(View.GONE);
        
        //TextView timer = (TextView) findViewById(R.id.txt_zeit);    
        //timer.setVisibility(100);
        
        //Timer instanzieren und starten
        seconds = 120;
        mHandler.removeCallbacks(mUpdateTimeTask);
        mHandler.post(mUpdateTimeTask);
        
    }

}
Danke dennoch an Euch alle.

Grüße
stdevel ist offline   Mit Zitat antworten
Alt 05.08.2011, 23:02   #3 (permalink)
Android Guru
 
Benutzerbild von Fr4gg0r

Modell: Samsung Galaxy S (I9000)

Registriert seit: 21.12.2009
Beiträge: 2.572
Abgegebene Danke: 76
Erhielt 506 Danke für 295 Beiträge
Standard AW: Zugriff von Ticker/Timer-Klasse auf TextView-Objekt

Ich vermisse da irgendwo eine Abbruchbedinung in der run() Methode..
ansonsten braucht deine App noch schön CPU Last, wenn der User schon wieder auf dem Homescreen ist.
Fr4gg0r ist offline   Mit Zitat antworten
Alt 11.08.2011, 09:44   #4 (permalink)
Neuer Benutzer

Modell: HTC Desire HD

Registriert seit: 05.08.2011
Beiträge: 8
Abgegebene Danke: 0
Erhielt 0 Danke für 0 Beiträge
Standard AW: Zugriff von Ticker/Timer-Klasse auf TextView-Objekt

Hi!

Sorry für die späte Antwort - ja, da hast Du recht. Das Ganze war noch mehr ein unfertiges Code-Snippet. Die Abbruch-Bedingung gibt's natürlich. Danke aber nochmals für den Hinweis.

Mein Simulator ist übrigens jetzt in einer ersten Version erschienen, siehe auch hier: http://www.android-hilfe.de/android-...ml#post1826749



Gruß!
stdevel ist offline   Mit Zitat antworten
Antwort

Stichworte
ticker, timer, timertask

Themen-Optionen
Ansicht


Ähnliche Themen

Thema Autor Forum Antworten Letzter Beitrag
Zugriff auf eine Textview innerhalb einer Hierarchie Kalei Android App Entwicklung 0 08.06.2011 14:50
Zugriff auf eigen View-Klasse funktioniert nicht flash2910 Android App Entwicklung 2 03.06.2011 01:28
Werte aus einer Klasse einer anderen Klasse übergeben und TextView verändern funk Android App Entwicklung 1 07.12.2010 11:13
Zugriff auf PC von Desire ehrgeiz Root / Hacking / Modding für HTC Desire 2 09.05.2010 18:01
TabHost von Klasse auf andere Klasse zugreifen Tai Android App Entwicklung 9 11.06.2009 17:03




Du liest gerade: "Zugriff von Ticker/Timer-Klasse auf TextView-Objekt" unter "Android App Entwicklung" auf Android-Hilfe.de.


Powered by vBulletin®
Copyright ©2000 - 2012, vBulletin Solutions, Inc.
Search Engine Friendly URLs by vBSEO
© Android-Hilfe.de 2012 - All rights reserved.