Статьи

Оповещение об информационной активности в разработке приложений для Android

Создание многопоточных приложений для разработки приложений Android является сложной задачей для многих разработчиков Android. Однопоточный и многопоточный подходы используются для создания сложных корпоративных мобильных приложений Android, поскольку они помогают оптимизировать функциональную работу кода. Но иногда необходимо обновить пользовательский интерфейс из фонового потока о выполненных операциях. Если вы когда-либо пытались получить доступ к элементу пользовательского интерфейса из фонового потока, вы уже заметили, что выдается исключение. В этой статье объясняется, как уведомлять действия с информацией, размещенной в другой ветке.

Для создания многопоточных приложений Android по умолчанию не позволяет разработчику изменять пользовательский интерфейс за пределами основного потока. С этой проблемой сталкиваются многие программисты, и если бы вам все-таки удалось это сделать, вы бы нарушили второе правило однопоточной модели, которое гласит : « Не обращайтесь к инструментарию пользовательского интерфейса Android извне потока пользовательского интерфейса », как указано здесь http : //developer.android.com/guide/components/processes-and-threads.html .

проблема

При создании сложных многопоточных функций в корпоративном приложении для Android информация, генерируемая из этих потоков, не уведомляется в пользовательском интерфейсе, что приводит к несоответствию бизнес-логики приложения и сбою приложения.

Решение

  • Реализация обработчика метод класса, переопределение handleMessage () , который будет считывать сообщения из очереди потока

  • Следующее сообщение с использованием метода sendMessage () в рабочем потоке

Существует много ситуаций, когда требуется, чтобы поток работал в фоновом режиме и отправлял информацию в основной поток пользовательского интерфейса Activity . На архитектурном уровне мы можем использовать два разных подхода для уведомления о активности потоков.

  1. Использование Android AsyncTask класса

  2. Создать новый поток

    Использование AsyncTask очень удобно, так как могут возникнуть ситуации, когда вам действительно нужно создать рабочий поток самостоятельно. В такой ситуации вам нужно будет отправить некоторую информацию обратно в ветку Activity . Помните, что Android не позволяет другим потокам изменять содержимое основного потока пользовательского интерфейса, как указано выше. Вместо этого вам необходимо заключить данные в сообщения и отправить их через очередь сообщений.
    Вы можете реализовать эту операцию в двух частях:

Часть 1 — Добавить обработчик

Добавьте экземпляр класса Handler в ваш экземпляр MapActivity .

public class MyMap extends MapActivity {
. . . .
public Handler _handler = new Handler() {
@Override
public void handleMessage(Message msg) {
Log.d(TAG, String.format("Handler.handleMessage(): msg=%s", msg));
// This is where main activity thread receives messages
// Put here your handling of incoming messages posted by other threads
super.handleMessage(msg);
}
};
. . . .
}

Часть 2 — Сообщение

В рабочем потоке отправляйте сообщение в основную очередь действий всякий раз, когда вам нужно добавить экземпляр класса обработчика в ваш экземпляр MapActivity .

/**
* Performs background job
*/
class MyThreadRunner implements Runnable {
// @Override
public void run() {
while (!Thread.currentThread().isInterrupted()) { 
// Just dummy message -- real implementation will put some meaningful data in it
Message msg = Message.obtain();
msg.what = 999;
MyMap.this._handler.sendMessage(msg);
// Dummy code to simulate delay while working with remote server
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
}
}
}

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

Загляните в наш блог, где рассказывается о тестировании мобильных приложений: лучшие практики . Ознакомьтесь с нашими службами разработки и тестирования мобильных приложений для Android .