Preciso verificar se o segmento executando um determinado pedaço de código é o segmento principal (UI) ou não. Como posso conseguir isso?
Preciso verificar se o segmento executando um determinado pedaço de código é o segmento principal (UI) ou não. Como posso conseguir isso?
Respostas:
Looper.myLooper() == Looper.getMainLooper()
se isso retornar true, você estará no thread da interface do usuário!
você pode usar o código abaixo para saber se o thread atual é UI / Main thread ou não
if(Looper.myLooper() == Looper.getMainLooper()) {
// Current Thread is Main Thread.
}
ou você também pode usar isso
if(Looper.getMainLooper().getThread() == Thread.currentThread()) {
// Current Thread is Main Thread.
}
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: *
Thread.currentThread().equals( Looper.getMainLooper().getThread() )
Ou, se a plataforma de tempo de execução for o nível 23 da API (Marshmallow 6.0) ou superior:
Looper.getMainLooper().isCurrentThread()
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
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:
boolean isUiThread = VERSION.SDK_INT >= VERSION_CODES.M
? Looper.getMainLooper().isCurrentThread()
: Thread.currentThread() == Looper.getMainLooper().getThread();
E, se você deseja executar algo no thread da interface do usuário, pode usar o seguinte:
new Handler(Looper.getMainLooper()).post(new Runnable() {
@Override
public void run() {
//this runs on the UI thread
}
});
Você pode checar
if(Looper.myLooper() == Looper.getMainLooper()) {
// You are on mainThread
}else{
// you are on non-ui thread
}
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:
public static void main(String[] args{
Thread.currentThread().setName("SomeNameIChoose");
/*...the rest of main...*/
}
Depois de definir isso, em outro lugar do seu código, você pode verificar facilmente se está prestes a executar no thread principal com:
if(Thread.currentThread().getName().equals("SomeNameIChoose"))
{
//do something on main thread
}
Um pouco envergonhado, eu tinha procurado antes de lembrar isso, mas espero que ajude alguém!
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.
Xamarin.Android
porta: ( C#
)
public bool IsMainThread => Build.VERSION.SdkInt >= BuildVersionCodes.M
? Looper.MainLooper.IsCurrentThread
: Looper.MyLooper() == Looper.MainLooper;
Uso:
if (IsMainThread) {
// you are on UI/Main thread
}
Você pode tentar Thread.currentThread (). IsDaemon ()