Шаблон наблюдателя в Android

1

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

Шаг 3 - проблема, поскольку она говорит:

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

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

Теги:
observer-pattern

3 ответа

2
Лучший ответ

Используйте 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...
    }
}
  • 0
    Спасибо за ответ, на самом деле данные продолжают поступать через некоторый промежуток времени с сервера, и мне снова приходится обновлять интерфейс. В этом примере я предполагаю, что doInbackground выполняется только при нажатии кнопки, но в моем случае кто-то (поток) всегда должен быть готов к приему данных с сервера и передаче в пользовательский интерфейс для обновления. Тем временем пользовательский интерфейс работает нормально (webview) ....
  • 0
    Вы можете вызывать publishProgress каждый раз, когда получаете другую порцию данных. Смотрите обновленный ответ.
Показать ещё 2 комментария
2

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

  • 0
    Можете ли вы предложить мне пример кода или некоторые ссылки, это будет очень полезно для меня. Поскольку я должен реализовать чат 1. Если пользователь находится в другой активности и возвращается к активности чата, он должен получить обновленный чат.
1

Шаблон объекта 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.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню