Como detectar o thread de IU no Android?

117

Existe uma maneira robusta de detectar se Thread.currentThread()o thread de IU do sistema Android está em um aplicativo?
Eu gostaria de colocar algumas afirmações em meu código de modelo que afirmam que apenas uma thread ( por exemplo, a thread ui) acessa meu estado, para garantir que nenhum tipo de sincronização seja necessária.

ParDroid
fonte
Veja minha resposta aqui: stackoverflow.com/a/41280460/878126
android developer

Respostas:

199

A prática comum para determinar a identidade do UI Thread é por meio do Looper # getMainLooper :

if (Looper.getMainLooper().getThread() == Thread.currentThread()) {
  // On UI thread.
} else {
  // Not on UI thread.
}

A partir da API de nível 23, há uma abordagem um pouco mais legível usando o novo método auxiliar isCurrentThread no looper principal:

if (Looper.getMainLooper().isCurrentThread()) {
  // On UI thread.
} else {
  // Not on UI thread.
}
Mik3y
fonte
6
stackoverflow.com/questions/11411022/… Esta resposta também é boa)
UnknownJoe
44

Acho que a melhor maneira é esta:

 if (Looper.getMainLooper().equals(Looper.myLooper())) {
     // UI thread
 } else {
     // Non UI thread
 }
Átomo
fonte
Funciona bem. Obrigado!
Hong
3
Não há necessidade de usar, equalspois estamos apenas comparando referências e, além disso, ambas são estáticas.
mr5 de
8

A partir do nível 23 da API, ele Looperpossui um método auxiliar interessante isCurrentThread. Você pode obter o mainLoopere ver se é o único para o tópico atual desta forma:

Looper.getMainLooper().isCurrentThread()

É praticamente o mesmo que:

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

mas poderia ser um pouco mais legível e fácil de lembrar.

stan0
fonte
2

Além de verificar o looper , se você já tentou fazer logout do ID do thread onCreate(), poderá encontrar o ID do thread de IU (thread principal) sempre igual a 1. Portanto

if (Thread.currentThread().getId() == 1) {
    // UI thread
}
else {
    // other thread
}
Yushulx
fonte
Não consigo encontrar nenhuma documentação oficial que comprove que isso seja verdade, e sempre será. Você tem um link?
intrepidis
Isso é o que eu encontrei no logcat quando desejo monitorar o comportamento multi-thread. Você pode tentar
gerar a
8
Eu não recomendo fortemente, pois este valor pode ser específico para o seu dispositivo e / ou versão do Android. Mesmo que fosse o caso em todos os dispositivos Android agora, não há garantia de que continuará a ser o caso nas versões posteriores. Salvar o ID do thread em um membro da classe ao executar onCreate () parece um pouco mais razoável para mim.
personne3000
1

Você não poderia usar o runOnUiThreadmétodo na Activityaula? Veja ..

http://developer.android.com/reference/android/app/Activity.html#runOnUiThread%28java.lang.Runnable%29

Ridoy
fonte
4
Meu aplicativo está funcionando, mas tem vários autores e está se tornando bastante grande e complexo. O que eu quero fazer é adicionar uma rede de segurança extra, uma declaração que captura o erro se alguém está chamando um método que é projetado para ser chamado apenas a partir do thread da GUI de outro thread.
ParDroid
No momento, estou corrigindo um bug em que o uso de runOnUiThread faz com que o UX pisque.
fobbymaster