Quando eu preciso de algo para executar de forma assíncrona , como uma tarefa de longa duração ou uma lógica que usa a rede, ou por qualquer motivo, iniciar um novo thread e executá-lo funcionam bem. Criar um manipulador e executá-lo também funcionam. Qual é a diferença? Quando devo usar cada um? Quais são as vantagens / razões para usar a Handler
e não a Thread
?
PS. - Por esta questão, vamos ignorar AsyncTask
. - o Handler().postDelayed
caso de uso é claro para mim, pelo bem desta pergunta, vamos supor que preciso que a tarefa seja iniciada imediatamente.
Respostas:
Se o que você estiver fazendo for "pesado", deverá fazê-lo em um Thread. Se você não iniciá-lo explicitamente em seu próprio encadeamento, ele será executado no encadeamento principal (UI) que pode ser percebido como instável ou lento para responder à interface de seus usuários.
Curiosamente, quando você está usando um encadeamento, geralmente é útil usar um manipulador como um meio de comunicação entre o encadeamento de trabalho que você está iniciando e o encadeamento principal.
Uma interação típica Thread / Handler pode ser algo como isto:
Em geral, porém, o que você leva para casa é que você deve usar um Thread sempre que estiver executando algum trabalho que possa ser demorado ou muito intenso (ou seja, qualquer rede, IO de arquivo, aritmética pesada, etc.).
fonte
updateUI()
será executado depoisonCreateView
(após o carregamento de novas visualizações)?message.what()
? Não seria apenasif(msg == 0){
? Muito obrigado! :)Handler e Thread são realmente duas coisas diferentes.
Um encadeamento deve ser criado para executar trabalhos de execução longa.
Um manipulador é um objeto muito conveniente para se comunicar entre 2 threads (por exemplo: um thread em segundo plano precisa atualizar a interface do usuário. Você pode usar um manipulador para publicar alguns Runnable do thread em segundo plano no thread da interface do usuário).
Portanto, você não tem escolha entre Manipulador ou Thread. Use um thread para fazer trabalhos pesados! (você pode usar um manipulador se o encadeamento em segundo plano acionar algum trabalho a ser realizado em outro encadeamento - na maioria das vezes o encadeamento da interface do usuário)
fonte
Handler
eThread
são duas coisas diferentes, mas elas não se contradizem. Você pode ter umHandler
e umThread
ao mesmo tempo e, na verdade, cada umHandler
deve estar executando em umThread
.Para mais detalhes, consulte este artigo .
fonte
A
Handler
é executado da mesma formaThread
, aThread
é executado em um thread diferente.Use um manipulador se precisar executar algo no mesmo encadeamento , geralmente um elemento da GUI ou algo assim.
Use um Thread se quiser manter o thread principal livre para fazer outras coisas . Use isso para qualquer coisa que leve uma quantidade significativa de tempo.
fonte
Manipuladores são a melhor maneira de comunicação entre o segundo plano e o thread da interface do usuário. Geralmente, os manipuladores são associados à fila de mensagens de um segmento e são usados para enviar mensagens e executáveis para a mensagem.
USAR:
Encadeamento: para executar tarefas no encadeamento saperate (plano de fundo) que no encadeamento da interface do usuário. (ajuda a desbloquear o thread da interface do usuário)
Manipulador Usado para se comunicar entre a interface do usuário e o thread de segundo plano.
Dê uma olhada neste artigo
fonte
... mais informações aqui sobre threads etc. (inclui informações dos diferentes mecanismos de encadeamento e sincronização e quando usar o que)
fonte
Um manipulador permite enviar e processar mensagens e
Runnable
objetos associados a um encadeamentoMessageQueue
. CadaHandler
instância está associada a um único encadeamento e à fila de mensagens desse encadeamento.Quando você cria um novo
Handler
, ele é vinculado à fila de encadeamentos / mensagens do encadeamento que o está criando - a partir desse momento, ele envia mensagens e executáveis para essa fila de mensagens e as executa quando saem da fila de mensagens. .Existem dois usos principais para um manipulador:
Se você usa threads java, precisa lidar com algumas coisas sozinho - sincronizando com o thread principal, cancelando um thread etc.
Esse único thread não cria um pool de threads, a menos que você use
ThreadPoolExecutor
ouExecutorService
API.(Retirou esta consulta dos seus comentários na resposta do Blackbelt)
Referência: artigo Desempenho de Encadeamentos
Existem certos tipos de trabalho que podem ser reduzidos a tarefas distribuídas altamente paralelas. Com o grande volume de pacotes de trabalho, isso cria
AsyncTask
eHandlerThread
não é uma classe apropriada. A natureza de thread únicoAsyncTask
transformaria todo o trabalho em thread em um sistema linear. O uso daHandlerThread
classe, por outro lado, exigiria que o programador gerencie manualmente o balanceamento de carga entre um grupo de threads.ThreadPoolExecutor é uma classe auxiliar para facilitar esse processo. Essa classe gerencia a criação de um grupo de threads, define suas prioridades e gerencia como o trabalho é distribuído entre esses threads. À medida que a carga de trabalho aumenta ou diminui, a classe gira ou destrói mais threads para ajustar a carga de trabalho.
Você pode consultar este artigo do guia do desenvolvedor sobre create-threadpool para obter mais detalhes.
Dê uma olhada nesta postagem para saber
Handler
como executar várias instâncias Runnable. Nesse caso, todas asRunnable
tarefas serão executadas em um único thread.Android: Brinde em um tópico
fonte
Handler
pode ser usado em conjunto comThread
para criar um mecanismo na fila. Você pode usar ohandler
para postar algo noThread
Looper
fonte