2017-01-07 1 views
1

Ich brauche einen Timer, um jederzeit zu starten. Ich drücke eine Taste (auf der Taste selbst), die anzeigt, wie viele Sekunden seit dem Drücken in Echtzeit vergangen ist. Immer wenn es erneut gedrückt wird, wird der Timer auf 0 zurückgesetzt und beginnt erneut zu inkrementieren.Ausführen einer Methode jede Sekunde, beginnend mit dem Tastendruck

Ich weiß, dass dies nicht der richtige Weg ist, der Button funktioniert gut, aber der Timer sollte in onCreate sein? Ich bin mir nicht sicher, wie dies soll mit einem Knopf dieses

public class MainActivity extends Activity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 

     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     downloadedImg = (ImageView) findViewById(R.id.imageView); 
    } 

    public void clickAsync(View view) { 

      new ImageDownloader().execute(downloadUrl); 
      int seconds = 0; 
      Button button = (Button) view; 

      button.setText("Seconds since clicked: " + seconds); 
      Timer timer = new Timer(); 

      //each time button is clicked, time is reset to 0 and increments in real time 
      timer.scheduleAtFixedRate(new TimerTask() 
      { 
       public void run() 
       { 
        seconds = 0; 
        seconds++; 
        button.setText("Seconds since clicked: " + seconds); 
       } 
      }, 0, 1000); 
     } 
} 
+0

deklarieren 'Timer Timer' in der Klasse direkt nicht in' ClickAsync() ' –

+0

Ich verstehe Ihre Frage nicht. Was willst du erreichen? –

+0

@JayminPanchal, aber die Sekunden/Schaltfläche müssen als final deklariert werden, da auf sie innerhalb der inneren Klasse zugegriffen wird, so dass mein Code nicht funktioniert –

Antwort

1

Eine weitere einfache Möglichkeit, dies zu tun ist Handler

mHandler = new Handler(); 

Nurrufen verwendenMethode auf einen Klick wird es sec im Intervall von 1 Sekunde aktualisieren

Runnable UpdateRunnable = new Runnable() { 

    @Override 
    public void run() { 
     updateSec(); 
    } 
}; 

    public void updateSec() { 
      mSeconds++; 
      mHandler.postDelayed(UpdateRunnable, 1000); 
    } 

Beispiel

button.setOnClickListener(new OnClickListener() { 

public void onClick(View v) { 
    mSeconds = 0; 
    updateSec();//it'll update sec variable every second. 
    } 
}); 
1

versuchen arbeiten: Verwenden Sie einen Handler

long startTime = 0; 
long elapsedTime ; 

//runs without a timer by reposting this handler at the end of the runnable 
Handler timerHandler = new Handler(); 
Runnable timerRunnable = new Runnable() { 

    @Override 
    public void run() { 
     long millis = System.currentTimeMillis() - startTime; 
     int seconds = (int) (millis/1000); 
     int minutes = seconds/60; 
     int hours = minutes/60; 
     seconds = seconds % 60; 
     //textview for displaying time.. 
     timerTextView.setText(String.format("%d:%02d:%02d", hours, minutes, seconds)); 

     timerHandler.postDelayed(this, 1000); 
    } 
}; 

b.setOnClickListener(new View.OnClickListener() { //b is your button 

    @Override 
    public void onClick(View v) { 
     Button b = (Button) v; 
     if (b.getText().equals("Stop")) { 
      elapsedTime = System.currentTimeMillis() - startTime; 
      timerHandler.removeCallbacks(timerRunnable); 
      b.setText("Resume"); 
     } else { 
      startTime = System.currentTimeMillis() - elapsedTime; 
      timerHandler.postDelayed(timerRunnable, 0); 
      Calendar cs = Calendar.getInstance(); 
      System.out.println("Current time => " + cs.getTime()); 
      SimpleDateFormat df = new SimpleDateFormat("HH:mm"); 
      String formattedDate = df.format(cs.getTime()); 
      timerTextView.setText(formattedDate); 
      b.setText("Stop"); 
     } 
    } 
}); 

es wird die verstrichene Zeit und zeigt Zeit nach dem Stopp berechnen ...

0

Sie Threads verwenden können:

@Override 
public void onClick(View view){ 
switch(view.getId()){ 
case R.id.button: 
new Thread(new Runnable() { 
@Override 
public void run() { 
try{ 
Thread.sleep(1000); 
} catch(InterruptedException e) { 
e.printStackTrace(); 
} 
count++; 
textView.post(new Runnable() { 
@Override 
public void run() { 
textView.setText(count + ""); 
} 
}); 
} 
} 
}).start; 
break; 
} 
} 

die Ansicht aktualisiert werden muss, Haupt-Thread, und so müssen Sie post() -Methode verwenden, die Runnable-Instanz als Parameter hat.

Alternativ können Sie auch AsyncTask verwenden.

Verwandte Themen