У меня проблема.
1. У меня есть два потока: поток "worker" и "UI".
2. Работник продолжает ждать данных с сервера, когда получает уведомление о потоке пользовательского интерфейса.
3. В окне обновления UI отображается сообщение Toast на экране.
Шаг 3 - проблема, поскольку она говорит:
android.view.ViewRoot $CalledFromWrongThreadException: только оригинальный поток, создавший иерархию представлений, может коснуться его представлений.
Используя mHandler, runOnUIThread замедляет поток пользовательского интерфейса (пользовательский интерфейс отображает веб-просмотр), поскольку я должен постоянно проверять данные с сервера.
Используйте AsyncTask для реализации этого. Переопределите doInBackground для получения данных (выполняется в отдельном потоке), затем переопределите onPostExecute(), чтобы показать тост (он выполняется в потоке пользовательского интерфейса).
Вот хороший пример http://www.screaming-penguin.com/node/7746
И вот официальные документы.
UPD: пример того, как обрабатывать частичный прогресс.
class ExampleTask extends AsyncTask<String, String, String>{
@Override
protected String doInBackground(String... params) {
while(true){
//Some logic on data recieve..
this.publishProgress("Some progress");
//seee if need to stop the thread.
boolean stop = true;
if(stop){
break;
}
}
return "Result";
}
@Override
protected void onProgressUpdate(String... values) {
super.onProgressUpdate(values);
//UI tasks on particular progress...
}
}
Я бы использовал сервис и привязывал вашу деятельность к сервису. Затем служба может отправлять широковещательную рассылку, когда она имеет новые данные.
Шаблон объекта Observer в Android?
Определение: Шаблон наблюдателя определяет зависимость "один ко многим" между объектами, так что когда один объект меняет состояние, все его иждивенцы уведомляются и обновляются автоматически.
The objects which are watching the state changes are called observer. Alternatively observer are also called listener. The object which is being watched is called subject.
Example: View A is the subject. View A displays the temperature of a container. View B display a green light is the temperature is above 20 degree Celsius. Therefore View B registers itself as a Listener to View A. If the temperature of View A is changed an event is triggered. That is event is send to all registered listeners in this example View B. View B receives the changed data and can adjust his display.
Evaluation: The subject can registered an unlimited number of observers. If a new listener should register at the subject no code change in the subject is necessary.