Qual é a diferença entre Activity.runOnUiThreade View.post, alguém poderia, por favor, explicar?
Qual é a diferença entre Activity.runOnUiThreade View.post, alguém poderia, por favor, explicar?
Respostas:
Não há nenhuma diferença real, exceto que o View.posté útil quando você não tem acesso direto à atividade.
Em ambos os casos, se não no thread da IU, Handler#post(Runnable)será chamado nos bastidores.
Como CommonsWare mencionou no comentário, há uma diferença entre os dois - quando chamado no segmento Ui, Activity#runOnUiThreadirá chamar o runmétodo diretamente, enquanto View#postirá postar o runnablena fila (por exemplo, chamar o Handler#post)
O ponto importante da IMO é que ambos tenham o mesmo objetivo, e para quem o utiliza, não deve haver diferença (e a implementação pode mudar no futuro).
runOnUiThread()verifica o thread atual e executa Runnableimediatamente se estivermos no thread principal do aplicativo. post()sempre coloca o Runnablena fila, não importa em qual thread seja chamado.
runOnUiThread()verifica o thread atual e executa Runnableimediatamente se estivermos no thread principal do aplicativo " (ênfase adicionada). "Isso significa que o que quer que esteja atualmente no thread da interface do usuário será ignorado e terá a primeira prioridade? - "o que quer que esteja atualmente no thread da interface do usuário" é a runOnUiThread()chamada.
Outra diferença entre Activity.runOnUiThread e view.post () é que o executável em view.post () é chamado depois que a visualização é anexada a uma janela.
Ambos são aceitáveis para a maioria das situações e na maioria das vezes são intercambiáveis, mas são sutilmente diferentes. A maior diferença, claro, é que um está disponível em um Activitye o outro em a View. Há muita sobreposição entre eles, mas às vezes em um Activityvocê não terá acesso a um View, e às vezes em um Viewvocê não terá acesso a um Activity.
Um dos casos extremos que encontrei View.postmencionei em uma resposta a outra pergunta sobre o SOView.post : View.postsó funciona a partir de outro thread quando o Viewestá anexado a uma janela. Isso raramente é um problema, mas às vezes pode fazer com que o Runnablenunca seja executado, especialmente se você chamar View.posto onCreatemétodo do seu Activity. Uma alternativa é usar Handler.postwhat is what Activity.runOnUiThreade View.postuse under the covers de qualquer maneira.
(editado para precisão, adicionado "de outro tópico")
onCreate()também? Hm, espero que seja enviado para o Handlerfornecido por ViewRootnesse caso.
View.postdevo adicionar o Runnablea uma fila para ser executado mais tarde, se ainda não estiver anexado. Não cavei muito mais fundo na fonte, mas a documentação diz: "Este método pode ser invocado de fora do thread de interface do usuário somente quando esta View está anexada a uma janela." Então eu acho que se está no tópico atual, então o que você disse é verdade, se não estiver, provavelmente apenas engole o Runnable. Certamente isso aconteceu em meu código.