Проблемы с работоспособным - PullRequest
1 голос
/ 22 октября 2010

Мне посоветовали использовать этот код для выполнения моего метода через определенный промежуток времени, я немного его изменил, и теперь у меня есть:

private Handler mHandler = new Handler();
private Runnable mUpdateTimeTask = new Runnable() {
    public void run() {
        final long start = mStartTime;

        // Get the difference in ms
        long millis = SystemClock.uptimeMillis() - start;

        // Format to hours/minutes/seconds
        int mTimeInSec = (int) (millis / 1000);

        // Do your thing

        Location location = tracker.getLastKnownLocation(best);
        RetrieveAvgPower(location);

        // Update at the next second
        mHandler.postAtTime(this, 1000);//start + ((mTimeInSec + 10) * 1000));
    }
};

И я пытаюсь запустить и остановить его с помощью:

public void onClick(View v) {
         switch (v.getId()) {
            case R.id.start:
                    mStartTime = System.currentTimeMillis();
                    mHandler.removeCallbacks(mUpdateTimeTask);
                    mHandler.postDelayed(mUpdateTimeTask, 1000);
                    break;
                case R.id.stop:
                    mHandler.removeCallbacks(mUpdateTimeTask);
                    break;}}

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

Ответы [ 2 ]

2 голосов
/ 22 октября 2010

Не должна ли последняя строка run() вызывать Handler.postDelayed() вместо Handler.postAtTime()?

В зависимости от того, как реализованы очереди событий в Android, вы можете убить поток, используя неправильный ... вы в основном неоднократно устанавливаете Runnable для запуска через 1 секунду после первоначального запуска потока, поэтому другие события не получаются бежать.

1 голос
/ 22 октября 2010

Чтобы остановить работу, вы можете просто добавить что-то вроде этого:

class A implements Runnable
{
private volatile boolean runTask = false;

public void run()
{
   runTask = true;
   while(runTask)
   {
      // Do your thing
      Thread.sleep(1000); // wait 1 second before "Do your thing" again
   }
}


public void stop()
{
   runTask = false;
}


}

Что касается текста, который не обновляется, я не очень хорошо понял, это в Swing GUI, который не устанавливает?

EDIT Добавлен Thread.sleep (1000) в конце метода run

EDIT by peer: перемещен Thread.Sleep (1000), так что Runnable будет запускаться один раз в секунду до полной остановки (вместо этого).работать непрерывно и затем ждать 1 секунду после остановки).

...