runOnUiThread, Atalho de Acesso a Thread Principal no Android

Investir em Você é Barra de Ouro a R$ 2,00. Cadastre-se e receba grátis conteúdos Android sem precedentes! Você receberá um email de confirmação. Somente depois de confirma-lo é que eu poderei lhe enviar os conteúdos semanais exclusivos. Os artigos em PDF são entregues somente para os inscritos na lista.

Email inválido.
Blog /Android /runOnUiThread, Atalho de Acesso a Thread Principal no Android

runOnUiThread, Atalho de Acesso a Thread Principal no Android

Vinícius Thiengo
(8655) (6)
Go-ahead
"O método consciente de tentativa e erro é mais bem-sucedido que o planejamento de um gênio isolado."
Peter Skillman
Prototipagem Android
Capa do curso Prototipagem Profissional de Aplicativos
TítuloAndroid: Prototipagem Profissional de Aplicativos
CategoriasAndroid, Design, Protótipo
AutorVinícius Thiengo
Vídeo aulas186
Tempo15 horas
ExercíciosSim
CertificadoSim
Acessar Curso
Quer aprender a programar para Android? Acesse abaixo o curso gratuito no Blog.
Lendo
TítuloTest-Driven Development: Teste e Design no Mundo Real
CategoriaEngenharia de Software
Autor(es)Mauricio Aniche
EditoraCasa do Código
Edição1
Ano2012
Páginas194
Conteúdo Exclusivo
Investir em Você é Barra de Ouro a R$ 2,00. Cadastre-se e receba gratuitamente conteúdos Android sem precedentes!
Email inválido

Tudo bem?

Na vídeo aula acima nós vamos, passo a passo em um projeto Android de exemplo, estudar e praticar a API (ou método) runOnUiThread().

Este é um dos conteúdos que qualquer profissional Android, com experiência em ao menos um aplicativo em produção, julgaria importante.

Eu trato a API runOnUiThread como um atalho, seguro e recomendado, de acesso à thread principal de um aplicativo Android.

Mas antes de continuar com este texto, que servirá de auxílio ao que é apresentado em vídeo aula, confesso que é muito importante que você primeiro estude e pratique, por completo, o assunto "Thread Principal no Android", conteúdo que discuto em: Entendendo a Thread Principal de Um App Android.

Ai você pergunta: Ok, Thiengo. Mas por que devo primeiro consumir este artigo específico sobre a thread principal no Android? 🤔

Em resumo, sem rodeios: porque é o conteúdo pré-requisito para entender a runOnUiThread.

Se você está aqui, neste artigo e vídeo aula em específico, tem grandes chances de você estar apenas iniciando no mundo do desenvolvimento Android, certo?

Logo, pular etapas agora será certamente prejudicial pouco a frente em sua jornada como dev. Sendo assim, a partir do próximo parágrafo, já vou assumir que você entende por completo o assunto thread principal.

Voltando à runOnUiThread, está é um atalho ante ao uso de uma instância de Handler, consequentemente temos de utilizar muito menos linhas de código para conseguir acesso a thread principal e, muito provavelmente essa será a necessidade, atualizar algum componente visual, ou vários, dependente do algoritmo que estava executando em background.

Veja a seguir um simples código de exemplo da runOnUiThread sendo utilizada:

public class MainActivity
extends AppCompatActivity { /* AppCompatActivity é subclasse de Activity. */

@Override
protected void onCreate( Bundle savedInstanceState ){
...

new Thread( new Runnable() {
@Override
public void run() {

final int result;
/*
* Processamento pesado em thread secundária,
* fora da thread principal.
* */
...

runOnUiThread( new Runnable() {
@Override
public void run() {

/*
* textViewResult é um TextView, que
* pode ser atualizado somente dentro
* da thread principal, algo facilmente
* atingido com o método Activity
* runOnUiThread().
* */
textViewResult.setText(
String.format( "%d", result )
);
}
});
}
}).start();
}
...
}

 

É, eu confesso que não faria isso em nenhum dos projetos oficiais que eu estivesse trabalhando, projetos que iriam a produção, disponibilizados na Google Play Store. Isso, pois eu não curto o trabalho com instâncias inline, o que estou fazendo com a classe Thread, e com instâncias anônimas, o que estou fazendo com a Interface Runnable.

Prefiro colocar cada classe em seu respectivo pacote e preferencialmente fora do contexto de alguma outra classe, digo, fora do contexto estrutural, algo que ocorre com instâncias inline, instâncias anônimas e classes internas, como o conhecido ViewHolder em RecyclerView.Adapter.

Por que falei sobre isso, sobre codificação organizada?

Mais para atrair a sua atenção, novamente, para um dos principais ganhos no uso da runOnUiThread: código mais organizado, pois o número de linhas, o algoritmo em geral, para acesso à thread principal é menor e não perde em nada na leitura dele.

Um ponto importante também abordado em vídeo aula e que vejo necessidade de ênfase aqui é que a API runOnUiThread é na verdade parte da classe Activity e não da classe Context, logo, preste atenção no tipo de parâmetro que você define em métodos e construtores quando houver a necessidade de uso da runOnUiThread, pois é comum nós, em desenvolvimento, trabalharmos com o tipo Context diretamente.

Para finalizar sobre a runOnUiThread:

Muitas das APIs de comunicação remota no Android já têm o próprio método de acesso a thread principal, ou seja, para essas APIs não será preciso o uso da runOnUiThread ou de qualquer outra API que já não seja a da própria biblioteca de comunicação remota em uso.

Antes de finalizar, vou deixar abaixo alguns links de outros artigos do Blog, também com vídeos, que lhe colocarão em dia com o que há de atual no mundo do desenvolvimento Android:

E caso você tenha o desejo de aprender a criar apps Android, ou evoluir nesta área, também com o conteúdo gratuito do Blog, então não deixe de acessar a lista de estudos em: Estudando Android - Lista de Conteúdos do Blog.

Não esqueça de se inscrever 📫 na lista de e-mails do Blog para receber os conteúdos Android exclusivos, liberados semanalmente... e também em suas versões em PDF (versões em PDF são liberadas somente aos inscritos da lista de e-mails).

Se inscreva também no canal do Blog no YouTube para acompanhar as últimas novidades disponibilizadas em vídeo aula.

Surgindo dúvidas ou dicas, pode colocar abaixo na área de comentários que logo eu lhe retorno.

Obs. : o link para download do projeto apresentado em vídeo se encontra logo abaixo no artigo, na seção "Download".

Abraço.

Eclipse IDE vs Android Studio IDE

Apesar de o conteúdo da vídeo aula deste artigo estar utilizando o IDE Eclipse 😱, tudo que é apresentado, tanto a parte teórica quanto a parte prática, é ainda válido nos dias de hoje com o desenvolvimento Android utilizando o Android Studio IDE 😁.

Ou seja, independente da linguagem oficial (Java, Kotlin, C ou C++), IDE ou framework que você esteja utilizando, o conteúdo acima é ainda muito válido.

AndroidX

Apesar do conteúdo sobre a API runOnUiThread() ainda estar atual e ser de grande importância para qualquer nível de desenvolvedor Android.

Apesar disso eu também recomendo, assim que finalizado o projeto em sua própria instalação de IDE, que você o migre para o AndroidX.

Algo que pode ser feito com poucos cliques, como apresentado no tutorial a seguir: Migrar para o AndroidX.

Fonte

runOnUiThread() - documentação oficial Android

Investir em Você é Barra de Ouro a R$ 2,00. Cadastre-se e receba grátis conteúdos Android sem precedentes!
Email inválido

Relacionado

Style, String, Dimen, Color e WindowNoTitle no Android, Entendendo e UtilizandoStyle, String, Dimen, Color e WindowNoTitle no Android, Entendendo e UtilizandoAndroid
Spinner (ou Select) no Android, Entendendo e UtilizandoSpinner (ou Select) no Android, Entendendo e UtilizandoAndroid
Mudar Ícone de Sua APP Android Quando Usuário já a InstalouMudar Ícone de Sua APP Android Quando Usuário já a InstalouAndroid
Infográfico - 10 Conhecimentos Para Um Bom Desenvolvimento em AndroidInfográfico - 10 Conhecimentos Para Um Bom Desenvolvimento em AndroidAndroid

Compartilhar

Comentários Facebook

Comentários Blog (6)

Para código / script, coloque entre [code] e [/code] para receber marcação especifica.
Forneça seu nome válido.
Forneça seu email válido.
Forneça o comentário.
Enviando, aguarde...
04/02/2015
Olá, Thiengo estou usando esse exemplo para comunicar com servidor web (Using Caché Server Pages (CSP) da InterSystems) e até funciona, mas após 4 vezes clicando no botão de enviar dá erro e fecha o app no emulador do android. Você saberia me dizer algo o que pode ser ?
Responder
Vinícius Thiengo (0) (0)
05/02/2015
Fala Luis, blz?
Esta travando o botão quando já tem uma chamada sendo realizada ao serve Web ou está deixando o usuário realizar clicks seguidos mesmo quando já há dados sendo baixados? De qualquer forma não utilize essa versão para baixar dados da Web, recomendo que utilize o Volley (http://www.thiengo.com.br/volley-no-android-entendendo-e-utilizando ) que é tb recomendado pelo Google. Abraço
Responder
05/02/2015
Na verdade clico no botão espero o retorno e depois clico denovo, na 4 vez o app é fechado. Mas valeu pela dica, irei tentar o Volley. Obrigado.
Responder
07/02/2015
Olá Thiengo, resolvi o problema. Usei uma solução ruim, mas que funciona segundo um blog do Vanderson Guidi que encontrei na internet utilzei o StrictMode para permitir que seja possível efetuar uma operação de rede na thread principal.

protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
        StrictMode.setThreadPolicy(policy);
...
}
Responder
Vinícius Thiengo (0) (0)
07/02/2015
Ok Luis, porém não recomendo e nem mesmo o Android (Google), pois operações pesadas (operações de rede estão neste conjunto) devem ser realizada fora da thread principal, não somente pela possível Exception, mas tb pq operações pesadas na Thread UI travam a tela do usuário atrapalhando em mt a utilização da APP. Qualquer conexão de rede via Android é considerada pesada, pois vc não tem controle da situação (velocidade) da rede. Eu tb utilizo gambiarra quando necessário, mas essa gambiarra, pelo menos para mim, vai lhe dar mta dor de cabeça tendo em mente que há "várias" formas de realizar operações de rede de maneira segura, digo, fora da Thread principal. Abraço
Responder
08/02/2015
Valeu pela dica. J? encontrei uma solu??o usando a classe Asynctask. Aprendo muito com o seu blog e j? consigo desenvolver uns apps bem  sem precisar em fazer um curso de android.  Sucesso.
Responder