* Таким образом, у меня есть 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
Вы не должны называть 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(), а затем вернув его.
Вы пытались использовать
timer.interrupt()
вместо
timer.stop()
это теперь "более правильный путь". Тем не менее, реальный чистый путь, как уже сказал Фрэнк Спосаро, заключается в том, чтобы иметь внутренний флаг, который вы смотрите на каждую точку в потоке, где вы можете остановиться, а затем остановить поток изнутри. Что касается сценария sleep(), попробуйте прерывать()