После того , как Android-Studio
он предупредил меня, что слишком большая нагрузка на основной поток.
Пропущено 113 кадров: приложение может выполнять слишком много работы в своем основном потоке.
Я создал runnable для запуска потока с некоторыми процессами:
new Thread(new Runnable() {
@Override
public void run() {
UpdateUI(); //Actualiza datos de la Interfaz de usuario
}
}
Но возвращает ошибку:
Только исходный поток, создавший иерархию представлений, может касаться ее представлений.
Я искал SO, и вы можете запустить поток
getActivity().runOnUiThread(new Runnable() {
@Override
public void run() {
//Cambiar controles
}
});
Но так как мне нужно сделать много проверок, иначе поток выполняется одновременно, он возвращает перегрузку основного потока. Я даже замечаю, что боковое меню тормозит при закрытии.
Как создать поток, но иметь доступ к элементам интерфейса для изменения их данных или состояния?
Чтобы исправить ошибку:
Вы можете прибегнуть к
runOnUIThread
илиAsyncTask
в зависимости от задачи, которую нужно выполнить, если требуется много процесса непосредственно дляAsyncTask
runOnUiThread для запуска потока с доступом к элементам интерфейса:
Асинтаск
Чтобы выполнить задачу, которая много потребляет, и информировать пользователя о процессе, а в конце обновить пользовательский интерфейс:
doInBackground
домашнем заданииСледующее позволяет вам взаимодействовать с элементами пользовательского интерфейса
onProgressUpdate
сообщить о своем прогрессеonPostExecute
конце обновите пользовательский интерфейс.Пример асинхронной задачи:
Некоторые советы
У меня была аналогичная проблема, и я решил ее следующим образом в этом примере в коде обработчика событий: