Как узнать, выполняется ли исполняемый код в основном потоке (поток пользовательского интерфейса)?
С Swing я использую метод isEventDispatchThread
...
Как проверить, работает ли в потоке пользовательского интерфейса в Android?
Ответ 1
Не похоже, что в SDK есть метод. Проверка находится в классе ViewRoot
и выполняется путем сравнения Thread.currentThread()
с членом класса, который назначен в конструкторе, но никогда не отображается.
Если вам действительно нужна эта проверка, у вас есть несколько вариантов ее реализации:
- catch android.view.ViewRoot $CalledFromWrongThreadException
-
post
aRunnable
для просмотра и проверкиThread.currentThread()
- используйте
Handler
, чтобы сделать то же самое
В общем, я думаю, вместо того, чтобы проверять правильность потока, вы должны просто убедиться, что код всегда выполняется в потоке пользовательского интерфейса (с использованием 2. или 3.).
Ответ 2
Используйте Looper.getMainLooper(). getThread(), чтобы получить поток пользовательского интерфейса. Вы можете проверить, является ли это текущим потоком, используя следующее выражение:
Looper.getMainLooper().getThread() == Thread.currentThread()
Ответ 3
Это поток пользовательского интерфейса, если:
Looper.myLooper() == Looper.getMainLooper()
Исходный исходный код AOSP: ManagedEGLContext.java#L100
, SharedPreferencesImpl.java#L470
, Instrumentation.java#L1650
и т.д..
Ответ 4
Вы также можете использовать runOnUiThread, для этого требуется только runnable, который будет запущен в потоке ui
Ответ 5
Если вы хотите узнать, находитесь ли вы в основном потоке, вы можете попробовать:
Context c = **Get a Context**;
Thread.currentThread() == c.getMainLooper().getThread();
Конечно, я могу ошибаться, и это может полностью отразить ваше приложение.