2009-12-04 4 views

ответ

8

Не похоже, что в SDK есть метод. Проверка находится в классе ViewRoot и выполняется путем сравнения Thread.currentThread() с классом, который назначен в конструкторе, но не отображается.

Если вам действительно нужно это проверить у вас есть несколько вариантов его реализации:

  1. поймать android.view.ViewRoot $ CalledFromWrongThreadException
  2. postRunnable на вид и проверить Thread.currentThread()
  3. Используйте Handler сделать то же самое

В целом я думаю вместо , проверяя независимо от того, находитесь ли вы в правильной нити, вы должны просто убедиться, что код код всегда выполняется в потоке пользовательского интерфейса (с использованием 2. или 3.).

+0

10 +1 для (3) <отступ для 15 пределов> – Will

104

Используйте Looper.getMainLooper(). GetThread(), чтобы получить поток пользовательского интерфейса. Вы можете проверить, если это текущий поток, используя следующее выражение:

Looper.getMainLooper().getThread() == Thread.currentThread() 
+6

Так что просто для объяснения, фактическая проверка, которую вы можете сделать, это: (Looper.getMainLooper(). GetThread() == Thread.currentThread()) – greg7gkb

+0

Этот anwer нужно больше любви, спасибо alot – Inverce

9

Вы можете также использовать runOnUiThread, он требует только исполняемый, который будет работать в пользовательском интерфейсе нити

+7

Может быть стоит отметить, что если вы вызовете runOnUiThread из потока пользовательского интерфейса, код будет выполнен в соответствии с остальной частью вашего кода. – stork

+0

Это не отвечает на вопрос, связанный с идентификацией потока пользовательского интерфейса, а не с выполнением кода на нем. – CJBS

76

Это поток пользовательского интерфейса, если:

Looper.myLooper() == Looper.getMainLooper() 

Источник Источник AOSP код: ManagedEGLContext.java#L100, SharedPreferencesImpl.java#L470, Instrumentation.java#L1650and so on.

+0

Короткие и сладкие. Потеря 'getThread()' опрятна. – ahcox

+5

Стоит отметить, что хотя bbalazs упоминает его о ICS, это поддерживается API 1 и далее. Поэтому должно быть безопасно для всех устройств! –

+0

➕1 для ссылки на источник AOSP. – CJBS

2

Если вы хотите знать, если вы находитесь в главном потоке, вы могли бы, возможно, попробовать:

Context c = **Get a Context**; 
Thread.currentThread() == c.getMainLooper().getThread(); 

Конечно, я могу ошибаться, и это может полностью взорвать ваше приложение вверх.

+0

Быстрый тест показывает, что это хорошо работает. –

+0

Это работает, но нет необходимости получать контекст, см. Ответ bbalazs. –