Как остановить поток в разработке Android, который имеет метод сна в потоке

1

* Таким образом, у меня есть Thread, который содержит метод сна, и я думаю, что это проблема, потому что моя программа падает, когда я пытаюсь остановить ее, используя метод stop(). Я пытаюсь полностью остановить поток, когда пользователь нажимает кнопку "Назад" (кнопка "Назад"). Как мне это сделать? Должен ли я использовать что-то другое, кроме метода сна? *

Thread timer2 = new Thread() { // Threads - do multiple things
        public void run() {
            try {
                sleep(5000); // 5000 mil secs = 5 secs . sleeps thread
            } catch (InterruptedException e) {
                e.printStackTrace();
            } finally {
                cdt2.start();
            }
        }
    };
    timer2.start(); // starts thread


public boolean onKeyDown(int keyCode, KeyEvent event) {
        if (keyCode == KeyEvent.KEYCODE_BACK) {
          timer1.stop(); //error
          timer2.stop(); //error
          cdt.cancel();
          cdt2.cancel();
          Intent menu = new Intent("android.intent.action.MENU");
          startActivity(menu);
          return true;
        }
        return false;
      }

LOG CAT:

06-20 13:08:58.006: D/dalvikvm(22050): GC_CONCURRENT freed 951K, 7% free 15393K/16455K,    paused 2ms+3ms
06-20 13:08:58.944: D/dalvikvm(22050): GC_CONCURRENT freed 700K, 6% free 15533K/16455K, paused 2ms+1ms
06-20 13:09:01.733: D/dalvikvm(22050): GC_CONCURRENT freed 955K, 7% free 15630K/16647K, paused 2ms+2ms
06-20 13:09:02.069: D/dalvikvm(22050): GC_CONCURRENT freed 880K, 7% free 15707K/16711K, paused 2ms+2ms
06-20 13:09:02.678: D/dalvikvm(22050): GC_CONCURRENT freed 762K, 5% free 15940K/16775K, paused 2ms+2ms
06-20 13:09:03.303: D/AccountTypeManager(21214): Registering external account type=ro.weednet.contactssync, packageName=ro.weednet.contactssync
06-20 13:09:03.311: D/AccountTypeManager(21214): Registering external account type=com.skype.contacts.sync, packageName=com.skype.raider
06-20 13:09:03.311: W/ResourceType(21214): getEntry failing because entryIndex 1377 is beyond type entryCount 189
06-20 13:09:03.311: W/ResourceType(21214): Failure getting entry for 0x7f020561 (t=1 e=1377) in package 0 (error -2147483647)
06-20 13:09:03.311: W/ResourceType(21214): getEntry failing because entryIndex 1378 is beyond type entryCount 189
06-20 13:09:03.311: W/ResourceType(21214): Failure getting entry for 0x7f020562 (t=1 e=1378) in package 0 (error -2147483647)
06-20 13:09:03.311: W/ResourceType(21214): getEntry failing because entryIndex 1379 is beyond type entryCount 189
06-20 13:09:03.311: W/ResourceType(21214): Failure getting entry for 0x7f020563 (t=1 e=1379) in package 0 (error -2147483647)
06-20 13:09:03.311: W/ResourceType(21214): getEntry failing because entryIndex 1778 is beyond type entryCount 189
06-20 13:09:03.311: W/ResourceType(21214): Failure getting entry for 0x7f0206f2 (t=1 e=1778) in package 0 (error -2147483647)
06-20 13:09:03.311: D/AccountTypeManager(21214): Registering external account type=com.yahoo.mobile.client.share.sync, packageName=com.yahoo.mobile.client.android.mail
06-20 13:09:03.319: D/AccountTypeManager(21214): Registering external account type=com.facebook.auth.login, packageName=com.facebook.katana
06-20 13:09:03.319: W/ResourceType(21214): getEntry failing because entryIndex 344 is beyond type entryCount 189
  • 0
    Размещенный вами логкат не имеет отношения к вашей проблеме. Должны быть сообщения об ошибках, связанные с тем, что ваше приложение отображается красным, когда происходит сбой
Теги:
multithreading
timer
methods
sleep

2 ответа

2
Лучший ответ

Вы не должны называть stop() на runnable. Вместо этого вам нужно вернуть Thread. Для этого вам нужен только флаг, который можно установить в true. В этом случае у mStopThread установлено значение false, и когда вы можете убить свой поток, просто установите его в true и он вернется. Тем не менее, я обычно вижу это в какой-то петле с меньшим временем сна.

Thread timer2 = new Thread() { // Threads - do multiple things
        public void run() {
            try {
                if (mStopThread) return;
                sleep(5000); // 5000 mil secs = 5 secs . sleeps thread
            } catch (InterruptedException e) {
                e.printStackTrace();
            } finally {
                cdt2.start();
            }
        }
    };
timer2.start(); // starts thread

Если вы не решили изменить пример кода, чтобы сделать более строгий цикл, чем вы всегда можете просыпать свой поток, вызвав timer2.interrupt(), а затем вернув его.

  • 0
    Спасибо, достаточно просто.
0

Вы пытались использовать

timer.interrupt()

вместо

timer.stop()

это теперь "более правильный путь". Тем не менее, реальный чистый путь, как уже сказал Фрэнк Спосаро, заключается в том, чтобы иметь внутренний флаг, который вы смотрите на каждую точку в потоке, где вы можете остановиться, а затем остановить поток изнутри. Что касается сценария sleep(), попробуйте прерывать()

Ещё вопросы

Сообщество Overcoder
Наверх
Меню