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