2010-08-16 6 views
1

У меня проблема.
1. У меня есть два потока: поток «рабочий» и «пользовательский интерфейс».
2. Работник продолжает получать данные с сервера, когда получает уведомление о потоке пользовательского интерфейса.
3. В окне обновления UI отображается сообщение Toast на экране.Шаблон наблюдателя в Android

Шаг 3 является проблемой, так как она говорит:

android.view.ViewRoot $ CalledFromWrongThreadException: Только исходный поток, который создал иерархию вида может коснуться его точки зрения.

Использование mHandler, runOnUIThread замедляет поток пользовательского интерфейса (пользовательский интерфейс отображает веб-просмотр), так как я должен постоянно проверять данные с сервера.

ответ

2

Используйте AsyncTask для реализации этого. Переопределите doInBackground для получения данных (выполняется в отдельном потоке), затем переопределите onPostExecute(), чтобы показать тост (он выполняется в потоке пользовательского интерфейса).

Вот хороший пример http://www.screaming-penguin.com/node/7746

А вот official docs.

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... 
    } 
} 
+0

Благодарим за сообщение, Фактически данные продолжают поступать в некоторый промежуток времени от сервера, и снова я должен обновить интерфейс. В этом примере я предполагаю, что doInbackground выполняется только при нажатии кнопки, но в моем случае кто-то (поток) всегда должен быть готов к приему данных с сервера и перейти к пользовательскому интерфейсу, чтобы обновить себя. Тем временем UI sud работает нормально (webview) .... – Placidnick

+0

вы можете вызывать publishProgress каждый раз, когда получаете другую часть данных. См. Обновленный ответ. –

+0

ohhh wow ...... я твой большой фанат :) Konstantin rocks !!! Спасибо. – Placidnick

2

Я бы воспользовался услугой и привязал свою деятельность к сервису. Затем служба может отправить широковещательную рассылку, когда она имеет новые данные.

+0

Можете ли вы предложить мне образец кода или какую-то ссылку, это было бы полезно для меня. Как я должен реализовать чат 1.если пользователь находится в другом действии и возвращается в чат, он должен получить обновленный чат. – Placidnick

1

Объект Наблюдательный шаблон в Android?

Определение: Паттерн Observer определяет один-ко-многим зависимость между объектами так, что когда один объект изменяет состояние, все его иждивенцев уведомлены и обновляется автоматически.

 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. 
Смежные вопросы