Почему 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)

Другие вопросы по тегам