как перезапустить тему в андроиде? - PullRequest
3 голосов
/ 22 июня 2010

в моем приложении для Android у меня есть ui-update-thread, который поддерживает все мои представления в актуальном состоянии.

protected Thread UIUpdateThread = new Thread()
{
 @Override
 public void run()
 {
  while(true)
  {
    query_some_data_from_service(); // gets some "fresh" data from a service
    UIUpdateHandler.sendEmptyMessage(0); // will update all ui elements with the new values
    sleep(1234);
  }
 }
};

Я начинаю эту тему в onCreate () с

UIUpdateThread.start();

и все работает отлично :), когда я покидаю активность (например, потому что я переключаюсь на другую деятельность), я звоню

UIUpdateThread.interrupt();

в onStop (), чтобы предотвратить постоянную работу потока. если я этого не сделаю, он продолжит работать, даже если я закрою приложение!?!? !!

проблема в том, как мне вернуть эту нить к жизни, возвращаясь из какой-либо другой деятельности к этой? run () не работает, вызов начального start () в другом методе, например onResume (), приводит к сбою приложения.

Я уже много чего пробовал, но, похоже, ничего не работает: (

Ответы [ 4 ]

6 голосов
/ 22 июня 2010

Ответ Atmocreation является правильным ... если исходить из того, что ваша реализация - хорошая идея.

Во-первых, поток, который вы здесь показываете, работает недолго и сразу же завершается самостоятельно, поэтому вам не нужно вызывать interrupt(), чтобы остановить его. В этом случае вам, вероятно, лучше перейти на AsyncTask, чем на собственный поток и обработчик, так как вам потребуется меньше кода и вы сможете воспользоваться пулом потоков AsyncTask.

Если ваш реальный поток - это не то, что вы показываете здесь, а какой-то бесконечный цикл, это вообще плохая идея. Никогда не создавайте занятые петли, особенно в Android. Скорее всего, есть лучшее решение для вашей проблемы, возможно, решение, которое также избавит от необходимости interrupt().

3 голосов
/ 22 июня 2010

Вы можете вызывать Thread.start () только один раз для каждого потока. Многократные вызовы start () вызовут исключения, которые, я уверен, вы заметили.

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

Обновление:

Тогда у вас все работает задом наперед. Ваш сервис должен сообщать вашему приложению, когда обновлять. Если вы делаете это таким образом, вам не нужен поток, работающий в вашем приложении, и ваша проблема будет решена. Вы можете использовать шаблон ResultsReceiver, который позволит вам связать действие с вашим сервисом и позволит сервису отправлять результаты обратно вашему действию. И всякий раз, когда onCreate запускает вашу деятельность, вы можете просто повторно привязать к сервису. Посмотрите, например, приложение Google I / O 2010 .

2 голосов
/ 22 июня 2010

в обычной Java (и я думаю, что это относится и к Android), Thread-Object не может быть возвращен к жизни после его остановки.

0 голосов
/ 29 июня 2013

Смотрите здесь:

Предлагаемые методы остановки потока в HowToStopAThread

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...