Preciso verificar se o segmento executando um determinado pedaço de código é o segmento principal (UI) ou não. Como posso conseguir isso?
java
android
multithreading
Charlie-Blake
fonte
fonte
Respostas:
se isso retornar true, você estará no thread da interface do usuário!
fonte
você pode usar o código abaixo para saber se o thread atual é UI / Main thread ou não
ou você também pode usar isso
Aqui está uma pergunta semelhante
fonte
Looper.myLooper()
retornará nulo se o encadeamento não estiver associado a um Looper. Portanto, ambos são seguros e têm o mesmo resultado, mas o primeiro é um pouco mais lento enquanto ele pesquisa dentro de um mapa para descobrir o looper e seu thread associado e fazer outras coisas.A melhor maneira é a maneira mais clara e robusta: *
Ou, se a plataforma de tempo de execução for o nível 23 da API (Marshmallow 6.0) ou superior:
Veja a API do Looper . Observe que a chamada
Looper.getMainLooper()
envolve sincronização (consulte a fonte ). Você pode evitar a sobrecarga armazenando o valor de retorno e reutilizando-o.* credit greg7gkb e 2cupsOfTech
fonte
Looper.myLooper() == Looper.getMainLooper()
, o que eu acho que é menos claro. Eu credito greg7gkb.equals
e, portanto, volta a ser==
, mas isso pode mudar no futuro. Então eu corrigi a resposta.Resumindo as soluções, acho que é a melhor:
E, se você deseja executar algo no thread da interface do usuário, pode usar o seguinte:
fonte
Você pode checar
fonte
Permitam-me que antecipe isso com: Eu reconheci que este post tem a tag 'Android', no entanto, minha pesquisa não teve nada a ver com 'Android' e esse foi o meu principal resultado. Para esse fim, para os usuários SO Java que não são do Android que chegam aqui, não se esqueça:
Depois de definir isso, em outro lugar do seu código, você pode verificar facilmente se está prestes a executar no thread principal com:
Um pouco envergonhado, eu tinha procurado antes de lembrar isso, mas espero que ajude alguém!
fonte
você pode verificá-lo no android ddms logcat, onde a identificação do processo será a mesma, mas a identificação da thread será diferente.
fonte
Xamarin.Android
porta: (C#
)Uso:
fonte
Você pode tentar Thread.currentThread (). IsDaemon ()
fonte