#android #multithreading
#Android #многопоточность
Вопрос:
Я создаю новые рабочие потоки из «основного» потока приложения. Эти потоки постоянно требуются для выполнения какой-либо операции, пока приложение работает. И, когда приложение завершает работу, я хочу, чтобы все рабочие потоки были очищены (что бы это ни значило) должным образом. Являются ли методы жизненного цикла единственным способом для этого? Существуют ли намерения / уведомления, которые получаются при выходе из приложения? Если да, можем ли мы зарегистрировать широковещательный приемник для таких намерений / уведомлений для выполнения требуемой очистки?
Спасибо,
Ashok.
Code Snippet:
импортируйте android.app.Activity;
импортируйте android.os.Bundle;
импортируйте android.util.Log;
открытый класс SomeThreadTest расширяет Activity { / **, вызываемый при первом создании activity. */ Thread t = null;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
t = new Thread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
while (true) {
try {
Thread.sleep(15000);
Log.d("SomeThreadTest", "Thread wokeup now");
} catch (InterruptedException e) {
Log.d("SomeThreadTest", "Thread interrupted exception called!");
e.printStackTrace();
return;
}
if (Thread.interrupted()) {
Log.d("SomeThreadTest", "I'm interrupted!");
}
}
}
}, "TestThread");
t.setDaemon(true);
t.start();
}
}
Ответ №1:
Рассмотрите возможность вызова WorkerThread.setDaemon(true), который сообщает потоку, который является поставщиком услуг, и чтобы УБИТЬ МЕНЯ, если основной поток, не являющийся демоном, завершается.
Ответ №2:
В Android есть потоки демонов и перехватчики завершения работы, которые могут вам здесь помочь, поскольку приложение выполняется в его собственной виртуальной машине.
Поток демона завершается при выходе виртуальной машины и не останавливает выход виртуальной машины. После создания потока вызовите thread.setDaemon(true), чтобы пометить поток как поток демона. Итак, если вы пометите все свои рабочие потоки daemon threads, виртуальная машина удалит эти потоки при выходе.
В качестве альтернативы, перехватчик завершения работы можно использовать для самостоятельной очистки потоков при выходе виртуальной машины. Чтобы зарегистрировать перехватчик завершения работы, вызовите Runtime.addShutdownHook(Thread), передавая поток, который еще не был запущен.
Комментарии:
1. спасибо за указатель. Я пробовал это, но, похоже, это не работает. Вот фрагмент кода, демонстрирующий то же самое. Можете ли вы указать, не упускаю ли я здесь чего-то очевидного? Я делаю только следующее в методе жизненного цикла onCreate и вообще ничего другого в других методах. Я публикую фрагмент кода как часть первоначального вопроса, поскольку раздел комментариев не допускает более 400 символов. Похоже, что этот код выводит ‘Thread wokeup now’ даже после того, как я выхожу из приложения.
2. В Android API говорится , что на Android жизненный цикл приложения не включает завершение работы виртуальной машины, поэтому вызов этого метода не гарантирует, что ваш код будет выполнен. Вместо этого вам следует использовать наиболее подходящее уведомление о жизненном цикле (Activity. Скажем, на паузе).