Android: выполнение вычислений в фоне
Есть класс, работающий с неким ViewGroup. Он инстанцируется в Main-треде, вначале выполняет некоторые манипуляции с вьюхами (они должны в Main-треде выполняться), после чего начинает некоторые вычисления, связанные с запросами в базу, загрузкой файлов и т.п, по их окончании должен опять произвести некоторые изменения во вьюхах. Видимо, следует вычисления в середине вынести из main-треда.
- Как правильно выйти из main-треда и вернуться? Вижу AsyncTask, Service, InstentService, Timer.Schedule, в котлине ещё и корутины. Что из этого использовать?
- Насколько тяжёлые вычисления следует выносить? Насколько сами переключения между тредами в андройде тяжелы? Чтобы затраты на них не перекрыли выгоду.
- Что если у меня будет параллельно сотня подобных объектов, каждый из которых начнёт переключаться в другой тред? Не расплодяться ли треды, не начнуться ли от этого проблемы?
Ответы (1 шт):
Запуск нового потока из основного это не проблема. Как только новый поток закончит работу, он уничтожится. Для сложных фоновых вычислений я использую след.запись:
// в основном потоке
Thread thread = new Thread(null, doBackgroundThreadProcessing,"Background");
thread.start();
private Runnable doBackgroundThreadProcessing = new Runnable() {
public void run() {
backgroundThreadProcessing();
}
};
private void backgroundThreadProcessing() {
Handler handler = new Handler(Looper.getMainLooper()) {
@Override
public void handleMessage(Message msg) {
// здесь вычисления
}
};
handler.sendEmptyMessage(1);
}
или
Thread myThread_turn = new Thread(new Runnable() {
@Override
public void run() {
// работа
}
});
myThread_turn.start(); // запускаем
Для обновления UI из потока использую
new Handler(Looper.getMainLooper()).post(new Runnable() {
@Override
public void run() {
Toast.makeText(getApplicationContext(), "Intent.ACTION_BATTERY_CHANGED", Toast.LENGTH_LONG).show();
}
});
Насколько тяжелые вычисления, решаете вы. Например работу с файлами, или интернетом, или устройствами, нужно выносить в отдельный поток. Если у вас вдруг появилась табличка "Приложение не отвечает", выносите расчеты в поток фоновый. Переполнение памяти никто не отменял, так что старайтесь не плодить потоки