2016-06-04 8 views
2

Ich lerne die Android-Entwicklung, die jetzt mache ich einen einfachen Timer, den ich brauche einen Handler, um es am Laufen zu halten. Wenn ich den Handler in die Hauptaktivität, alles Güter, aber ich möchte die Methode außerhalb der Haupttätigkeit setzen, so dass ich die Codes wiederverwenden kann und flexibler sein sollte, wenn ich etwas ändern möchte.Nicht in der Lage, Handler richtig in Android zu verwenden

hier ist mein Code:

*public class Timer{ 

    public void runTimer(TextView view, int seconds, boolean running){ 
     TextView timerTextView = (TextView) view; 
     Handler handler = new Handler(); 
     MyRunnable r = new MyRunnable(handler,view,seconds,running); 
     handler.post(r); 

    } 



} 

class MyRunnable implements Runnable { 
    private TextView view; 
    private int seconds; 
    private boolean running; 
    private Handler handler; 

    public MyRunnable(Handler handler, TextView view, int seconds, boolean running){ 
     this.handler= handler; 
     this.view =view; 
     this.seconds = seconds; 
     this.running = running; 
    } 

    public void run(){ 
     TextView timerTextView = (TextView) view; 
     int hours = seconds/3600; 
     int minutes = (seconds%3600)/60; 
     int secs = seconds%60; 
     String time = String.format("%d:%02d:%02d",hours,minutes,secs); 
     timerTextView.setText(time); 
     if (running){ 
      seconds++; 
     } 
     handler.postDelayed(this,100); 
    } 

}* 

Und ich erstellt ein Objekt in der Haupttätigkeit, diese Funktion aufzurufen. Die App kann zwar ausgeführt werden, aber der Timer funktioniert nicht ordnungsgemäß. Es läuft nur das erste Mal aber dann halt überhaupt nicht. Es läuft nicht weiter. Weißt du wo das Problem ist? danke für deine Hilfe zuerst!

Hauptcode:

*package com.mad.chapter4; 

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

public class StopWatchActivity extends AppCompatActivity { 

    private Timer timer = new Timer(); 


    private int seconds = 0; 
    private boolean running = false; 
    private boolean wasRunning; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_stop_watch); 
     TextView ttv = (TextView) findViewById(R.id.timerTextView); 

      if(savedInstanceState!=null){ 
       seconds = savedInstanceState.getInt("seconds"); 
       running = savedInstanceState.getBoolean("running"); 
       wasRunning = savedInstanceState.getBoolean("wasRunning"); 
      } 

     seconds = timer.runTimer(ttv,seconds,running); 
    } 

    public void onSaveInstanceState (Bundle savedInstanceState){ 
     savedInstanceState.putInt("seconds",seconds); 
     savedInstanceState.putBoolean("running",running); 
     savedInstanceState.putBoolean("wasRunning",wasRunning); 
    } 

    protected void onStop(){ 
     super.onStop(); 
     wasRunning = running; 
     running = false; 
    } 

    protected void onStart(){ 
     super.onStart(); 
     if(wasRunning){ 
      running = true; 
     } 
    } 



    public void onClickStartButton(View view){ 
     running = true; 
    } 

    public void onClickStopButton (View view){ 
     running = false; 
    } 

    public void onClickResetButton (View view){ 
     seconds = 0; 
     running = false; 
    } 



// public void runTimer(){ 
// 
//  final TextView timerTextView = (TextView) findViewById(R.id.timerTextView); 
//  final Handler handler = new Handler(); 
// 
//  Runnable r = new Runnable(){ 
//   @Override 
//   public void run(){ 
//    int hours = seconds/3600; 
//    int minutes = (seconds%3600)/60; 
//    int secs = seconds%60; 
//    String time = String.format("%d:%02d:%02d",hours,minutes,secs); 
//    timerTextView.setText(time); 
//    if (running){ 
//     seconds++; 
//    } 
//    handler.postDelayed(this,100); 
//   } 
//  }; 
// 
//  handler.post(r); 
// 
// 
// } 


}* 
+0

Ihr Code funktioniert gut, könnten Sie bitte auch Ihren Hauptaktivitätscode posten? –

+0

Danke und hier ist mein Hauptcode: –

+0

@HoMingTam: Bitte fügen Sie zusätzlichen Code zu der Frage, anstatt in Kommentaren. – halfer

Antwort

1

Von der Art, wie ich es sehe Ihre running und wasRunning nie auf true gesetzt, was wiederum Ihren UI nur erstes Mal nicht aktualisiert, aber nicht danach. Versuchen Sie, running und wasRunning auf True festzulegen, bevor Sie in OnCreate timer.runTimer(ttv, seconds, running) aufrufen. Ich denke, als Sie diesen Code in Aktivität anriefen, machten Sie einen Anruf an onClickStartButton(View view), der das running Flag auf true setzte und Ihre UI korrekt aktualisierte.

Auch Ihre runTimer Funktionen gibt nichts zurück, aber Sie in Ihrem Code Sie diese Funktion Ergebnis zu einem int zuweisen. Ist das ein Kopier-/Einfügefehler?

+0

Danke, aber es funktioniert nicht. –

+0

Ich habe Ihren Code ohne Flags "running" und "wasRunning" versucht und es funktioniert für mich. Können Sie bitte versuchen mit 'timer.runTimer (ttv, Sekunden, richtig)' – Harry

+0

Ja! Danke und der Timer startet jetzt. Aber es läuft weiter und ich kann die Knöpfe nicht benutzen, um es zu kontrollieren. Versucht, den timer.runtimer (ttv, Sekunden, wahr) in jeder Methode zu setzen, aber es funktioniert nicht, irgendeine Idee? –

Verwandte Themen