2010-06-22 3 views
3

в моем приложении для Android. У меня есть нить обновления, которая сохраняет все мои взгляды в актуальном состоянии.как перезапустить поток в android?

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(), сбой приложения.

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

ответ

6

Ответ от Atmocreation правильный, если предположить, что ваша реализация - это хорошая идея в первую очередь.

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

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

+0

Я вырезал почти все тела нитей, так как это казалось несущественным для демонстрационных целей. «исходный» поток имеет бесконечный цикл, запрашивающий некоторые данные из службы в каждом раунде. Затем обработчик отвечает за фактическое отображение данных, полученных потоком. , так как этот поток больше не работает при возврате этого действия, мой ui не получает больше обновлений. :(Вот почему мне нужно как-то снова запустить поток ... – xenonite

+0

решил это - см. мой ответ – xenonite

+0

Таймер - лучший вариант для таких задач, особенно на встроенной платформе. Занятые петли на сервере - это одно, но на телефоне с его бит-батареей ОС может справиться с задачами планирования с регулярными интервалами намного лучше. – Nate

2

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

3

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

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

Update:

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

+0

мое приложение показывает услугу, и этот поток периодически запрашивает эту услугу для обновления на данных. – xenonite

+0

обновил мой ответ. –

Смежные вопросы