Почему Fragment.onResume() не отображает мой графический интерфейс до полного завершения onResume?
Я пишу приложение для Android, которое взаимодействует с Motorola EMDK, и столкнулся с проблемой синхронизации / потоков. У меня есть действие, которое добавляет фрагмент для выполнения очень специфической функции с использованием EMDK, отображает экран, который сообщает пользователю, что происходит, а затем очищается этим действием примерно через 15 секунд.
Я замечаю задержку в 1-2 секунды между тем, когда происходит действие EMDK, в этом случае базовая станция устройства разблокируется, и когда отображается графический интерфейс пользователя с надписью "Базовая станция теперь разблокирована".
Я провел некоторое исследование о том, как Android обрабатывает отрисовку на экране для фрагментов, и все, что я могу найти, говорит о том, что onResume вызывается "когда фрагмент становится видимым". Однако это не соответствует моему опыту. В соответствии с тем, как я понимаю, приведенный ниже код должен работать, экран должен быть отрисован, а затем вызывается метод EMDKManager.getEMDKManager(), который создает указатель на службу EMDK и создает новый поток для выполнения разблокировки:
@Override
public void onResume() {
super.onResume();
EMDKManager.getEMDKManager(getActivity().getApplicationContext(), this);
}
Похоже, что экран отображается только после полного завершения onResume(), т.е. EMDKManager.getEMDKManager() также завершает свой вызов.
Поскольку фрагмент является объектом EMDKListener, который требуется для второго параметра метода, я изо всех сил пытаюсь найти способ правильно его обработать. Мне нужно, чтобы графический интерфейс был нарисован первым или одновременно с разблокировкой колыбели.
Существуют ли какие-либо другие методы, которые можно переопределить или связать с ними, чтобы получить эквивалент события onViewDrawn() для фрагмента?
Большое спасибо.
2 ответа
Хотя у меня есть огромные опасения по поводу использования / утечек памяти, я сделал это, чтобы правильно выбрать время:
private EMDKManager.EMDKListener getThis() {
return this;
}
private Runnable initEMDK = new Runnable() {
@Override
public void run() {
EMDKManager.getEMDKManager(getActivity().getApplicationContext(), getThis());
}
};
@Override
public void onResume() {
super.onResume();
Log.v(LOGTAG, "Starting");
new Thread(initEMDK).start();
}
Я чувствую, что есть стандартный способ сделать метод getThis(). Если вы это знаете, я бы с удовольствием узнал.
Спасибо.
Весь метод жизненного цикла onCreate()
, onResume()
onStop()
и т. д. вызываются основным потоком, который также отвечает за отрисовку пользовательского интерфейса.
Выполнив длинную операцию в этом методе, вы блокируете поток пользовательского интерфейса от обработки сенсорного ввода, а также отрисовки приложения.
Вы можете начать долгую работу в другом потоке, выполнив следующие действия:
new Thread(new Runnable() {
@Override
public void run() {
// do long operations here
}
}.start();
обратите внимание, что если эта операция хочет обновить компоненты пользовательского интерфейса, она ДОЛЖНА быть сделана в потоке пользовательского интерфейса, вы можете сделать это, передавая runnable в действие
activity.runOnUiThread(new Runnable() {
public void run() {
// do UI updating but, do not block it here
}
});
(или вы можете создать обработчик, если это Service
или вы хотите отложить эти runnables)