#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();
}
};