Главная » Разработка для Android » Создание потоков вручную и синхронизация с потоком GUI

0

Хотя использование AsyncTask  — хорошее решение,  случается,  что для работы в фоновом режиме приходится  создавать собственные  потоки и управлять ими.

В этом разделе  вы узнаете, как создавать  и запускать  новые объекты Thread,  синхронизировать их работу с потоком  GUI  перед обновлением пользовательского интерфейса.

Создание нового потока

Вы можете создавать дочерние потоки и управлять ими с помощью клас- са Handler,  предоставляемого Android,  а также классов, доступных  в про- странстве  имен java.lang.Thread. В листинге  9.11 показан  простой  каркас для переноса операций в дочерний поток.

Листинг 9.11. Перенос операций в фоновый  поток

// Этот метод вызывается из главного потока GUI. private void mainProcessing() {

// Здесь трудоемкие задачи переносятся в дочерний поток.

Thread thread = new Thread(null, doBackgroundThreadProcessing, "Background");

thread.start();

}

// Объект Runnable, который запускает метод для выполнения задач

// в фоновом режиме.

private Runnable doBackgroundThreadProcessing = new Runnable() {

public void run() {

backgroundThreadProcessing();

}

};

// Метод, который выполняет какие-то действия в фоновом режиме. private void backgroundThreadProcessing() {

[ … Трудоемкие операции … ]

}

Использование объекта Handler для выполнения операций с GUI

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

Уведомления и Намерения, размещенные  внутри  компонентов  вашего приложения, всегда принимаются и обрабатываются в графическом потоке. Во всех остальных случаях операции, явным образом взаимодействующие с объектами,  созданными в потоке GUI (например, Представлениями), или отображающие сообщения  (такие как объекты Toast), должны вызываться в главном потоке.

При работе в контексте Активности вы также можете использовать метод runOnUiThread, который принудительно выполняет задачу в потоке теку- щей Активности, как показано в листинге 9.12.

Листинг 9.12. Синхронизация с потоком Активности

runOnUiThread(new Runnable() {

public void run() {

// TODO Обновить Представление.

}

});

При иных обстоятельствах (например, отображении Toast или Notification) можете использовать класс Handler для перемещения методов в поток, в ко- тором сам Handler и создан.

С помощью класса Handler (точнее, его метода post) можно обновлять пользовательский интерфейс из фонового потока. В листинге 9.13 показана схема использования объекта Handler для обновления потока GUI.

Листинг 9.13. Использование Handler для синхронизации с графическим потоком

// Инициализируйте Handler в главном потоке. private Handler handler = new Handler();

private void mainProcessing() {

Thread thread = new Thread(null, doBackgroundThreadProcessing, "Background");

thread.start();

}

private Runnable doBackgroundThreadProcessing = new Runnable() {

public void run() {

backgroundThreadProcessing();

}

};

// Метод, который выполняет какие-то задачи в фоновом режиме. private void backgroundThreadProcessing() {

[ … Трудоемкие операции … ]

handler.post(doUpdateGUI);

}

// Объект Runnable, который запускает метод для обновления GUI. private Runnable doUpdateGUI = new Runnable() {

public void run() {

updateGUI();

}

};

private void updateGUI() {

[ … Открытие диалога или изменение графического элемента … ]

}

Класс Handler позволяет вам задерживать выполнение обновлений или проводить их в заданное время. Делается это с помощью методов postDelayed и postAtTime соответственно.

Источник: Майер P. Android 2 : программирование приложений для планшетных компьютеров и смартфонов : [пер. с англ. ] / Рето Майер. — М. : Эксмо, 2011. — 672 с. — (Мировой компьютерный бестселлер).

По теме:

  • Комментарии