2013-03-24 4 views
0

Я работаю в игре, поэтому мне нужно использовать время, которое обновляется каждые секунды. Я использую TimerTask.I хочу приостановить время. Когда я нажал кнопку и хочу возобновить ее снова когда я нажал кнопку возобновления из другой деятельности. Как это сделать, пожалуйста, помогите мне.Я хочу, чтобы TimerTask приостанавливалась и возобновлялась

t=new Timer(); 
{ 
t.scheduleAtFixedRate(new TimerTask() 
{ 
public void run() 
{ 
runOnUiThread(new Runnable() { 

@Override 
public void run() 
{ 
TextView tv = (TextView) findViewById(R.id.time); 
tv.setText(String.format("%02d:%02d",minute,seconds)); 

time += 1; 
seconds += 1; 
if(seconds==60) 
{ 
seconds=0; 
} 
minute=time/60; 
} 

        }); 
       } 
      }, 0, 1000); 

     } 
+0

'cancel()' Таймер, создайте новый и начните его при возобновлении. –

+0

не используйте таймер вообще! –

ответ

0
Try this this is what You want 
just copy and paste 


public class MainActivity extends Activity { 
EditText t; 
    Button b; 
    Button b2; 
    Timer timer; 
    public void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
     b=(Button)findViewById(R.id.button1); 
     b2=(Button)findViewById(R.id.button2); 
     t=(EditText)findViewById(R.id.editText1); 
     b.setBackgroundResource(android.R.color.holo_green_dark); 
     timer = new Timer(); 
     TimerTask updateProfile = new CustomTimerTask(MainActivity.this); 
     timer.scheduleAtFixedRate(updateProfile, 0,1000); 
b.setOnClickListener(new OnClickListener() { 

@Override 
public void onClick(View v) { 
    // TODO Auto-generated method stub 
    timer.cancel(); 
      } 
     }); 
b2.setOnClickListener(new OnClickListener() { 

@Override 
public void onClick(View v) { 
       // TODO Auto-generated method stub 
    timer = new Timer(); 
    TimerTask updateProfile = new CustomTimerTask(MainActivity.this); 
    timer.scheduleAtFixedRate(updateProfile, 0,1000); 
      } 
     }); 
    } 

    class CustomTimerTask extends TimerTask { 

     private Context context; 
     private Handler mHandler = new Handler(); 

     // Write Custom Constructor to pass Context 
     public CustomTimerTask(Context con) { 
      this.context = con; 
     } 

     @Override 
     public void run() { 

    new Thread(new Runnable() { 
    @Override 
    public void run() { 
    mHandler.post(new Runnable() { 
    @Override 
    public void run() { 
     Calendar c =Calendar.getInstance(); 
     int seconds = c.get(Calendar.SECOND); 
     int min= c.get(Calendar.MINUTE); 
     int hour= c.get(Calendar.HOUR); 
           t.setText(hour+":"+min+":"+seconds); 
         } 
        }); 
       } 
      }).start(); 

     } 

    } 
} 
0

Прежде всего, вам гораздо лучше использовать CountDownTimer. CountDownTimer внутренне использовал обработчик и выполняет обратные вызовы в пользовательском интерфейсе (основной поток). Это позволяет сделать ваш код более чистым.

CountDownTimer timer = new CountDownTimer(1000000, 1000) { 

    @Override 
    public void onTick(long millisUntilFinished) { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public void onFinish() { 
     // TODO Auto-generated method stub 

    } 
}; 
timer.start(); 

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

public class CountDownTimer { 
    private static Alarms sCountDownTimer; 

    public static CountDownTimer getCountDownTimer() { 
     if (sCountDownTimer == null) throw new NullPointerException("CountDownTimer not initialized yet"); 
     return sCountDownTimer; 
    } 

    public static void init(CountDownTimer countDownTimer) { 
     if (sCountDownTimer == null) { 
      sCountDownTimer = countDownTimer; 
     } else throw new RuntimeException("Attept to reinitialize!"); 
    } 
} 
0

На самом деле, вы гораздо лучше проводки вещи в потоке пользовательского интерфейса, задержки. Вы хотите что-то вроде:

final TextView tv = (TextView) findViewById(R.id.time); 
getMainLooper().postDelayed(
    new Runnable() { 
     @Override void run() { 
      tv.setText(String.format("%02d:%02d",minute,seconds)); 
    } }, 
    60 * 1000) 
Смежные вопросы