2016-06-04 2 views
2

Я изучаю разработку Android, и теперь я делаю простой таймер, для которого мне нужен обработчик, чтобы он работал. Если я помещаю обработчик в основное действие, все товары, но я хотел бы поместить метод вне основной деятельности, чтобы я мог повторно использовать коды и должен быть более гибким, если бы я хотел что-то изменить.Не удается правильно использовать обработчик в Android

вот мой код:

*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); 
    } 

}* 

И я создал объект в основной деятельности, чтобы вызвать эту функцию. Приложение может работать, но таймер работает неправильно. Он работает только в первый раз, а затем останавливается вообще. Он не работает. Вы знаете, где проблема? спасибо за вашу помощь!

Главный код:

*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

Ваш код работает нормально, не могли бы вы также указать свой основной код деятельности? –

+0

Спасибо, и вот мой основной код: –

+0

@HoMingTam: добавьте дополнительный код к вопросу, а не в комментарии. – halfer

ответ

1

От того, как я вижу это ваш running и wasRunning никогда не устанавливается в истину, которая, в свою очередь, не обновляя ваш UI только первый раз, но не после этого. Попробуйте установить running и wasRunning в true, прежде чем позвонить timer.runTimer(ttv, seconds, running) в onCreate. Я думаю, что когда вы вызывали этот код в действии, вы делали звонок до onClickStartButton(View view), который установил флаг running в true и правильно обновил ваш пользовательский интерфейс.

Кроме того, ваши функции runTimer не возвращают ничего, кроме вас в коде, который присваивает этот результат функции int. Это ошибка копирования/вставки?

+0

Спасибо, но это не сработает. –

+0

Я пробовал свой код без флагов 'running' и' wasRunning', и он работает для меня. Вы можете попробовать с помощью 'timer.runTimer (ttv, seconds, true)' – Harry

+0

Да! Спасибо, и таймер начинает работать. Но он работает, и я не могу использовать кнопки для управления им. Попытка поставить timer.runtimer (ttv, seconds, true) в каждый метод, но он не работает, любая идея? –

Смежные вопросы