Как я могу выполнять обработку неблокирующих событий на Android?

Этот вопрос касается обработки событий на Android. Это не относится к c ++.

Мне нужно обработать события UI / OS, без блокировки, когда все события были обработаны.

Причина в том, что приложение, которое я переношу, очень велико и не может быть легко переписано для работы с его собственным материалом в рабочем потоке. Вместо этого механизм приложения запрашивает, чтобы события UI / OS обрабатывались во время длинных операций, которые в противном случае были бы заблокированы.

Я обнаружил, что ALooper_pollAll (…) не делает этого для меня. Если я, например, создаю диалог в своей деятельности и запускаю длинную операцию, ALooper_pollAll () не отобразит мой диалог – он будет отображаться только тогда, когда я вернусь в основной цикл (я проверил это в onNativeWindowCreated).

Единственное решение, которое я нашел почти для работы, – это сделать внутренний цикл в потоке пользовательского интерфейса, вызвав следующий код через JNI:

public class MyActivity extends NativeActivity { private Handler _uiEventsHandler = null; private Runnable _uiEventsTask = new Runnable() { public void run() { Looper looper = Looper.myLooper(); looper.quit(); _uiEventsHandler.removeCallbacks(this); _uiEventsHandler = null; } }; public void ProcessEvents(int timeout) { if (_uiEventsHandler==null) { Looper looper = Looper.myLooper(); _uiEventsHandler = new Handler(looper); _uiEventsHandler.removeCallbacks(_uiEventsTask); //_uiEventsHandler.postDelayed(_uiEventsTask,timeout); _uiEventsHandler.post(_uiEventsTask); try { looper.loop(); } catch (RuntimeException re) { // We get an exception when we try to quit the loop, but the inner loop actually terminates } } } } 

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

Во время моих исследований я обнаружил, что могу получить MessageQueue от Looper и добавить IdleHandler, который может выйти из моего внутреннего цикла. Я еще не пробовал этого, должен быть лучший способ.

Учитывая тот факт, что это архитектура, с которой я должен придерживаться, что является лучшим решением?

Обновить:

Используя MessageQueue, я могу добиться того, что мне нужно:

 public class MyActivity extends NativeActivity { private class IdleHandler implements MessageQueue.IdleHandler { private Looper _looper; protected IdleHandler(Looper looper) { _looper = looper; } public boolean queueIdle() { _uiEventsHandler = new Handler(_looper); _uiEventsHandler.post(_uiEventsTask); return(false); } }; private boolean _processingEventsf = false; private Handler _uiEventsHandler = null; private Runnable _uiEventsTask = new Runnable() { public void run() { Looper looper = Looper.myLooper(); looper.quit(); _uiEventsHandler.removeCallbacks(this); _uiEventsHandler = null; } }; public void ProcessEvents() { if (!_processingEventsf) { Looper looper = Looper.myLooper(); looper.myQueue().addIdleHandler(new IdleHandler(looper)); _processingEventsf = true; try { looper.loop(); } catch (RuntimeException re) { // We get an exception when we try to quit the loop. } _processingEventsf = false; } } } 

Однако мне все же хотелось бы знать, есть ли лучшее решение.

    Не уверен, правильно ли я понял вопрос, но вы пытались использовать IntentService?

    http://developer.android.com/reference/android/app/IntentService.html

    Из документов:

    Этот шаблон «work queue processor» обычно используется для разгрузки задач из основного потока приложения. Класс IntentService существует, чтобы упростить этот шаблон и позаботиться о механике ».