проблема с остановкой просмотра в Android

#android

#Android

Вопрос:

я создаю для секундомера с помощью start, stop, я использую следующий код, который он запустил, но не остановил. пожалуйста, помогите мне. мой код:

 public class StopWatch2 extends Activity implements Runnable{

// text view influenced by the Thread
private TextView threadModifiedText;
int time=0;
Button b1,b2,b3;
/** Called when the activity is first created. */
Thread currentThread = new Thread(this);
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.stopwatch);

    b1=(Button)findViewById(R.id.button1);
    b2=(Button)findViewById(R.id.button2);
    b3=(Button)findViewById(R.id.button3);
    threadModifiedText = (TextView) findViewById(R.id.textView1);
    b1.setOnClickListener(new View.OnClickListener() 
    {
        public void onClick(View view) 
        {
            currentThread.start();
        }

    });     
    b2.setOnClickListener(new View.OnClickListener() 
    {
        public void onClick(View view) 
        {
            currentThread.stop();
        }

    });               
}

//Method you must override to control what the Thread is doing
@Override
public void run(){
    try {
        while(true){
            currentThread.sleep(1000, 0);
            threadHandler.sendEmptyMessage(0);
        }
        // signaling things to the outside world goes like this  

    } catch (InterruptedException e) {
    }   
} 
private Handler threadHandler = new Handler() {
    public void handleMessage(android.os.Message msg) {
        time  ;
        threadModifiedText.setText("" time);
    }
};
  

}

Ответ №1:

Я думаю, вам следует использовать переменную уровня класса boolean shouldRun = true ; в вашем run() методе while , который должен использоваться следующим образом

 while(shouldRun)
{
 //implementation
}
  

и в вашем b2.onClickListener() изменении shouldRun = false;

Редактировать: Для suspend и resume вы можете изменить значение shouldRun на shouldRun = true; в прослушивателе для кнопки возобновления. Помните, что при stop обновлении вам также следует сбросить time настройки. и в suspend time должно быть то же самое.

Комментарии:

1. спасибо, это работает и попробовано для приостановки и возобновления, я использую паузу для Thread.suspend () и возобновления, я использую Thread.resume(); Thread.resume () не возобновляет работу. как это сделать, пожалуйста…

2. извините за задержку, я попробовал следующее для запуска / возобновления: if(currentThread.getState()==Поток. Состояние.НОВОЕ){ currentThread.start(); Log.e («после»,»» currentThread.getState()); shouldr = true; b1.setText(«пауза»); } иначе{ SHOULDR = true; b1.setText(«пауза»); } запустите снова после паузы, пожалуйста, не запускайте метод run…

3. спасибо, это работает, я добавляю while, например: while (true){ while (shouldRun){ ….. } }

Ответ №2:

Я реализовал секундомер для измерения времени решения вращательных головоломок, и я подошел к этому несколько иначе.

  • Для измерения времени я использую объект-обработчик, который запускается после DISPLAY_UPDATE_TIMEOUT. Это время, после которого вы обновляете отображение прошедшего времени.

Чтобы начать подсчет, я использую:

 mLastStartTimestamp = System.currentTimeMillis();
mRepetitiveTimeoutHandler.postDelayed(processWatchTimer, DISPLAY_UPDATE_TIMEOUT);
  

и чтобы остановить это

 mRepetitiveTimeoutHandler.removeCallbacks(processWatchTimer);
mStartStopElapsed = System.currentTimeMillis() - mLastStartTimestamp ;
updateTimeDisplay();    
  

При каждом запуске обработчика я делаю следующее:

 private Runnable processWatchTimer = new Runnable()
{
    public void run() 
    {
        mRepetitiveTimeoutHandler.postDelayed(processWatchTimer, DISPLAY_UPDATE_TIMEOUT);
        updateTimeDisplay();            
    }
};