0

Я пишу приложение для Android, которое взаимодействует с Motorola EMDK, и я столкнулся с проблемой синхронизации/потоковой передачи. У меня есть активность, которая добавляет фрагмент для выполнения очень специфической функции с использованием EMDK, отображает экран, который сообщает пользователю, что происходит, а затем очищается от активности примерно через 15 секунд.Почему Fragment.onResume() не отображает мой графический интерфейс до тех пор, пока onResume не закончит полностью?

Я замечаю задержку в 1-2 секунды между тем, когда происходит действие EMDK, в этом случае разблокирована подставка устройства, и когда отображается графический интерфейс пользователя, который говорит: «Колыбель теперь разблокирован».

Я провел некоторое исследование о том, как Android обрабатывает рисунок на экране для фрагментов, и все, что я могу найти, говорит, что onResume называется «когда фрагмент становится видимым». Однако это не соответствует моему опыту. В соответствии с тем, как я понимаю, что приведенный ниже код должен работать, должен быть нарисован экран, а затем вызывается метод EMDKManager.getEMDKManager(), который создает указатель на службу EMDK и создает новый поток для выполнения разблокировки:

@Override 
public void onResume() { 
     super.onResume(); 
     EMDKManager.getEMDKManager(getActivity().getApplicationContext(), this); 
} 

Это больше похоже на то, что экран нарисован только один раз, когда функция onResume() завершается целиком, то есть EMDKManager.getEMDKManager() завершает свой вызов.

Поскольку фрагмент является объектом EMDKListener, который требуется для второго параметра для метода, я изо всех сил пытаюсь найти способ его правильной передачи. Мне нужен графический интерфейс, который нужно нарисовать первым или в то же время, когда происходит разблокировка подставки.

Есть ли какие-либо другие методы, которые можно переопределить или связать с ними, чтобы получить эквивалент события onViewDrawn() для фрагмента?

спасибо.

+1

Потому что так работает нить нитей и сообщений ... – Selvin

+0

Это был самый бесполезный комментарий. Спасибо. –

ответ

0

Весь жизненный цикл onCreate(), onResume()onStop() и т. Д. Вызывается основной нитью, которая также отвечает за создание пользовательского интерфейса.

По брикетирования длинной операции в той методе, вы блокировать поток пользовательского интерфейса от обработки сенсорного ввода, а также рисования приложения

вы можете начать свою долгую работу в другом потоке, делая так:

new Thread(new Runnable() { 
    @Override 
    public void run() { 
     // do long operations here 
    } 
}.start(); 

отметить, что, если эта операция хочет обновить компоненты пользовательского интерфейса, это должно быть сделано в потоке пользовательского интерфейса, вы можете сделать это, передав работоспособный к деятельности

activity.runOnUiThread(new Runnable() { 
    public void run() { 
     // do UI updating but, do not block it here 
    } 
}); 

(или вы можете создать обработчик, если это Service или вы хотите, чтобы задержать эти runnables)

+0

«Поскольку фрагмент - это объект EMDKListener, который требуется для второго параметра для метода, я изо всех сил пытаюсь найти способ его правильной передачи». Как вы порекомендовали бы ссылку на фрагмент как EMDKListener из Runnable? «это» больше не указывает на фрагмент в области Runnable. EMDKManager.getEMDKManager (Контекст, EMDKListener); –

+0

'MyAcitivity.this' будет ссылаться на активность в анонимном классе –

+0

Мне нужно указать на ФРАГМЕНТ не на активность. EMDKManager.getEMDKManager (Контекст, EMDKListener); –

0

Хотя у меня есть огромные опасения по поводу использования памяти/утечки, я сделал это для того, чтобы получить право газораспределительного:

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(). Если вы это знаете, я бы с удовольствием узнал.

спасибо.

+0

FYI, отправив на обработчик, вы все равно делаете это в потоке пользовательского интерфейса, но вы его немного задерживаете, до следующего прохода, так что, возможно, вы этого не захотите. в любом случае я не уверен, что делает этот EMDK, поэтому я не уверен, что –

+0

просто переключился на вашу рекомендуемую новую тему (initEMDK) .start(); так что это большая помощь. Спасибо. Поскольку я играю с этим больше, он по-прежнему не устраняет проблему. Что-то все еще висит в пользовательском интерфейсе/потоке системы. –

+0

Я бы не назвал EMDKManager.getEMDKManager для потока non ui ... Похоже, проблема не в этом вызове, так как выглядит хорошо обратный вызов ... Я взглянул на документацию и образцы, и я уверен, что вы скорее не будете следовать он ... и делает fx scanner.read() на ui thread ... – Selvin