Как узнать, выполняется ли исполняемый код в основном потоке (поток пользовательского интерфейса)?
С Swing Использую метод isEventDispatchThread
...Как проверить, работает ли в потоке пользовательского интерфейса в Android?
ответ
Не похоже, что в SDK есть метод. Проверка находится в классе ViewRoot
и выполняется путем сравнения Thread.currentThread()
с классом, который назначен в конструкторе, но не отображается.
Если вам действительно нужно это проверить у вас есть несколько вариантов его реализации:
- поймать android.view.ViewRoot $ CalledFromWrongThreadException
post
Runnable
на вид и проверитьThread.currentThread()
- Используйте
Handler
сделать то же самое
В целом я думаю вместо , проверяя независимо от того, находитесь ли вы в правильной нити, вы должны просто убедиться, что код код всегда выполняется в потоке пользовательского интерфейса (с использованием 2. или 3.).
Используйте Looper.getMainLooper(). GetThread(), чтобы получить поток пользовательского интерфейса. Вы можете проверить, если это текущий поток, используя следующее выражение:
Looper.getMainLooper().getThread() == Thread.currentThread()
Вы можете также использовать runOnUiThread, он требует только исполняемый, который будет работать в пользовательском интерфейсе нити
Может быть стоит отметить, что если вы вызовете runOnUiThread из потока пользовательского интерфейса, код будет выполнен в соответствии с остальной частью вашего кода. – stork
Это не отвечает на вопрос, связанный с идентификацией потока пользовательского интерфейса, а не с выполнением кода на нем. – CJBS
Это поток пользовательского интерфейса, если:
Looper.myLooper() == Looper.getMainLooper()
Источник Источник AOSP код: ManagedEGLContext.java#L100
, SharedPreferencesImpl.java#L470
, Instrumentation.java#L1650
and so on.
Если вы хотите знать, если вы находитесь в главном потоке, вы могли бы, возможно, попробовать:
Context c = **Get a Context**;
Thread.currentThread() == c.getMainLooper().getThread();
Конечно, я могу ошибаться, и это может полностью взорвать ваше приложение вверх.
Быстрый тест показывает, что это хорошо работает. –
Это работает, но нет необходимости получать контекст, см. Ответ bbalazs. –
10 +1 для (3) <отступ для 15 пределов> – Will