Sou novo no Android. Quero saber o que a Looper
classe faz e também como usá-la. Eu li a documentação da classe Android Looper, mas não consigo entendê-la completamente. Eu já vi isso em muitos lugares, mas incapaz de entender seu propósito. Alguém pode me ajudar definindo a finalidade Looper
e também dando um exemplo simples, se possível?
android
multithreading
android-looper
Khawar Raza
fonte
fonte
Respostas:
O que é Looper?
Looper é uma classe usada para executar as Mensagens (Runnables) em uma fila. Threads normais não possuem essa fila, por exemplo, thread simples não possui nenhuma fila. Ele é executado uma vez e após a conclusão do método, o thread não executa outra mensagem (executável).
Onde podemos usar a classe Looper?
Se alguém quiser executar várias mensagens (Runnables), deverá usar a classe Looper, responsável por criar uma fila no encadeamento. Por exemplo, ao escrever um aplicativo que baixa arquivos da Internet, podemos usar a classe Looper para colocar os arquivos a serem baixados na fila.
Como funciona?
Existe um
prepare()
método para preparar o Looper. Em seguida, você pode usar oloop()
método para criar um loop de mensagem no segmento atual e agora o seu Looper está pronto para executar as solicitações na fila até você sair do loop.Aqui está o código pelo qual você pode preparar o Looper.
fonte
Você pode entender melhor o que é Looper no contexto da estrutura da GUI. Looper é feito para fazer 2 coisas.
1) O Looper transforma um encadeamento normal , que termina quando o método run () retorna, em algo executado continuamente até o aplicativo Android ser executado , o que é necessário na estrutura da GUI (tecnicamente, ele ainda termina quando o método run () retorna. esclareça o que quero dizer abaixo).
2) O Looper fornece uma fila na qual os trabalhos a serem executados são enfileirados, o que também é necessário na estrutura da GUI.
Como você deve saber, quando um aplicativo é iniciado, o sistema cria um encadeamento de execução para o aplicativo, chamado “principal”, e os aplicativos Android normalmente executam inteiramente em um único encadeamento, por padrão, o “encadeamento principal”. Mas o tópico principal não é um tópico especial e secreto . É apenas um thread normal semelhante aos threads criados com o
new Thread()
código, o que significa que termina quando o método run () retorna! Pense no exemplo abaixo.Agora, vamos aplicar esse princípio simples aos aplicativos Android. O que aconteceria se um aplicativo Android fosse executado no encadeamento normal? Um thread chamado "main" ou "UI" ou o que quer que inicie seu aplicativo e desenha toda a interface do usuário. Portanto, a primeira tela é exibida para os usuários. E agora? O segmento principal termina? Não, não deveria. Deve esperar até que os usuários façam algo, certo? Mas como podemos alcançar esse comportamento? Bem, podemos tentar com
Object.wait()
ouThread.sleep()
. Por exemplo, o encadeamento principal termina seu trabalho inicial para exibir a primeira tela e dorme. Ele acorda, o que significa interrompido, quando um novo trabalho é feito. Até aqui tudo bem, mas neste momento precisamos de uma estrutura de dados semelhante a uma fila para armazenar vários trabalhos. Pense em um caso em que um usuário toca na tela em série e uma tarefa leva mais tempo para ser concluída. Portanto, precisamos ter uma estrutura de dados para manter os trabalhos a serem executados da maneira primeiro a entrar, primeiro a sair. Além disso, você pode imaginar, implementar o encadeamento sempre em execução e processar o trabalho quando chegou usando interrupção não é fácil e leva a um código complexo e muitas vezes impossível de manter. Preferimos criar um novo mecanismo para esse fim, e é disso que Looper trata . O documento oficial da classe Looperdiz: "Os threads por padrão não têm um loop de mensagem associado a eles" e Looper é uma classe "usada para executar um loop de mensagem para um thread". Agora você pode entender o que isso significa.Para deixar as coisas mais claras, vamos verificar o código em que o thread principal é transformado. Tudo acontece na classe ActivityThread . Em seu método main (), você pode encontrar o código abaixo, que transforma um thread principal normal em algo que precisamos.
e
Looper.loop()
método fazem um loop infinito e desenfileiram uma mensagem e processam uma de cada vez:Portanto, basicamente Looper é uma classe criada para solucionar um problema que ocorre na estrutura da GUI. Mas esse tipo de necessidade também pode acontecer em outra situação. Na verdade, é um padrão bastante famoso para aplicativos multiencadeados e você pode aprender mais sobre isso em " Concurrent Programming in Java ", de Doug Lea (Especialmente, o capítulo 4.1.4 "Worker Threads" seria útil). Além disso, você pode imaginar que esse tipo de mecanismo não é exclusivo na estrutura do Android, mas toda a estrutura da GUI pode precisar de algo semelhante a isso. Você pode encontrar quase o mesmo mecanismo no framework Java Swing.
fonte
O Looper permite que tarefas sejam executadas seqüencialmente em um único encadeamento. E manipulador define as tarefas que precisamos executar. É um cenário típico que estou tentando ilustrar neste exemplo:
Agora podemos usar o manipulador em alguns outros threads (por exemplo, thread da interface do usuário) para postar a tarefa no Looper para executar.
No thread da interface do usuário, temos um Looper implícito que nos permite manipular as mensagens no thread da interface do usuário.
fonte
Android
Looper
é um wrapper para anexarMessageQueue
aoThread
e gerencia o processamento da fila. Parece muito enigmático na documentação do Android e, muitas vezes, podemos enfrentarLooper
problemas de acesso à interface do usuário relacionados. Se não entendermos o básico, torna-se muito difícil de lidar.Aqui está um artigo que explica
Looper
ciclo de vida, como usá-lo e uso deLooper
noHandler
Looper = Thread + MessageQueue
fonte
Definição de Looper & Handler:
Looper é uma classe que transforma um encadeamento em um Pipeline Thread and Handler fornece um mecanismo para enviar tarefas a ele a partir de qualquer outro encadeamento.
Detalhes:
Portanto, um encadeamento PipeLine é um encadeamento que pode aceitar mais tarefas de outros encadeamentos através de um manipulador.
O Looper é nomeado assim porque implementa o loop - pega a próxima tarefa, executa-a, depois a próxima e assim por diante. O manipulador é chamado de manipulador porque é usado para manipular ou aceitar a próxima tarefa a cada vez de qualquer outro encadeamento e passar para o Looper (Thread ou PipeLine Thread).
Exemplo:
Um exemplo muito perfeito de Looper and Handler ou PipeLine Thread é baixar mais de uma imagem ou carregá-las em um servidor (Http), uma a uma em um único thread, em vez de iniciar um novo Thread para cada chamada de rede em segundo plano.
Leia mais aqui sobre Looper and Handler e a definição de Pipeline Thread:
Android Guts: Introdução aos Loopers e Manipuladores
fonte
Um Looper possui um
synchronized
MessageQueue
usado para processar as mensagens colocadas na fila.Ele implementa um
Thread
padrão de armazenamento específico.Apenas um
Looper
porThread
. Os principais métodos incluemprepare()
,loop()
equit()
.prepare()
inicializa a correnteThread
como aLooper
.prepare()
é umstatic
método que usa aThreadLocal
classe como mostrado abaixo.prepare()
deve ser chamado explicitamente antes de executar o loop de eventos.loop()
executa o loop de eventos que aguarda a chegada de mensagens na fila de mensagens de um segmento específico. Depois que a próxima mensagem é recebida, oloop()
método despacha a mensagem para seu manipulador de destinoquit()
desliga o loop de eventos. Não encerra o loop, mas enfileira uma mensagem especialLooper
pode ser programado deThread
várias maneirasAmpliar
Thread
Chame
Looper.prepare()
para inicializar o Thread como umLooper
Crie um ou mais
Handler
procedimentos para processar as mensagens recebidasLooper.loop()
para processar as mensagens até que o loop seja solicitadoquit()
.fonte
Vida útil do java O thread terminou após a conclusão do
run()
método. O mesmo encadeamento não pode ser iniciado novamente.Looper transforma normal
Thread
em um loop de mensagem. Os principais métodos deLooper
são:Este artigo dos mindorks de Janishar explica os conceitos principais de maneira agradável.
Looper
está associado a um thread. Se você precisarLooper
de um thread da interface do usuário,Looper.getMainLooper()
retornará um thread associado.Você precisa
Looper
estar associado a um manipulador .Looper
,,Handler
eHandlerThread
são a maneira do Android resolver os problemas de programação assíncrona.Depois de ter
Handler
, você pode ligar para as APIs abaixo.HandlerThread é uma classe útil para iniciar um novo thread que possui um looper. O looper pode então ser usado para criar classes de manipuladores
Em alguns cenários, você não pode executar
Runnable
tarefas no thread da interface do usuário. por exemplo, operações de rede: envie uma mensagem em um soquete, abra uma URL e obtenha conteúdo lendoInputStream
Nestes casos,
HandlerThread
é útil. Você pode obter umLooper
objetoHandlerThread
e criar umHandler
on emHandlerThread
vez de um thread principal.O código HandlerThread será assim:
Consulte a publicação abaixo para obter um código de exemplo:
Android: Brinde em um tópico
fonte
Noções básicas sobre threads Looper
Um java Thread uma unidade de execução que foi projetada para executar uma tarefa em seu método run () e terminar depois:
Mas no Android há muitos casos de uso em que precisamos manter um Thread ativo e aguardar entradas / eventos do usuário, por exemplo. Tópico da interface do usuário aka
Main Thread
.O encadeamento principal no Android é um encadeamento Java que é iniciado pela JVM no lançamento de um aplicativo e continua em execução até o usuário optar por fechá-lo ou encontrar uma exceção não tratada.
Agora, observe que aqui, embora o segmento principal seja o Java, ele continua ouvindo eventos do usuário e desenha quadros de 60 fps na tela e ainda assim não morre após cada ciclo. como é que é?
Os threads por padrão não têm um loop de mensagem associado a eles, mas você pode atribuir um chamando Looper.prepare () no método run e, em seguida, chamar Looper.loop ().
Se você quiser aprofundar a maneira como o Looper gerencia a
Message
fila de objetos, consulte o código-fonte deLooperclass
:Abaixo está um exemplo de como você pode criar
Looper Thread
e se comunicar com aActivity
classe usandoLocalBroadcast
Uso :
Podemos usar tarefas assíncronas ou serviços de intenção?
As tarefas assíncronas são projetadas para executar uma operação curta em segundo plano e fornecer progres e resultados no thread da interface do usuário. As tarefas assíncronas têm limites, como você não pode criar mais de 128 tarefas assíncronas e
ThreadPoolExecutor
permitirá apenas até 5 tarefas assíncronas .IntentServices
também são projetados para executar tarefas em segundo plano por um pouco mais de tempo e você pode usarLocalBroadcast
para se comunicarActivity
. Mas os serviços são destruídos após a execução da tarefa. Se você quiser mantê-lo em funcionamento por um longo tempo, você deve fazer o que quiserwhile(true){...}
.Outros casos de uso significativos para o Looper Thread:
Usado para comunicação de soquete bidirecional, em que o servidor continua ouvindo o soquete do cliente e reconheça o retorno
Processamento de bitmap em segundo plano. Passe o URL da imagem para o segmento Looper e ele aplicará efeitos de filtro, armazená-lo no local temporário e depois transmitir o caminho temporário da imagem.
fonte
Essa resposta não tem nada a ver com a pergunta, mas o uso de looper e a maneira como as pessoas criaram o manipulador e o looper em TODAS as respostas aqui são práticas ruins (algumas explicações estão corretas), preciso postar isso:
e para uma implementação completa
fonte
Manipular vários itens inativos ou de upload em um Serviço é um exemplo melhor.
Handler
eAsnycTask
são frequentemente usados para propagar Eventos / Mensagens entre a interface do usuário (thread) e um thread de trabalho ou para atrasar ações. Portanto, eles estão mais relacionados à interface do usuário.A
Looper
lida com tarefas ( Runnables, Futures ) em uma fila relacionada a threads em segundo plano - mesmo sem interação do usuário ou interface do usuário exibida (o aplicativo baixa um arquivo em segundo plano durante uma chamada).fonte
DOS DOCS
Looper
Looper
Classe usada para executar um loop de mensagem para athread
. Os encadeamentos por padrão não têm um loop de mensagem associado a eles; Para criar um, chameprepare()
o thread que deve executar o loop e façaloop()
com que ele processe as mensagens até que o loop seja interrompido.Looper
é um loop de manipulação de mensagens:MessageQueue
, que contém uma lista de mensagens. Um personagem importante do Looper é que ele está associado ao encadeamento no qual o Looper é criado.Looper
nome é assim porque implementa o loop - pega a próxima tarefa, executa-a, depois pega a próxima e assim por diante. OHandler
é chamado manipulador porque alguém não pôde inventar um nome melhorLooper
é uma classe Java na interface do usuário do Android que, juntamente com a classe Handler, processa eventos da interface do usuário, como cliques em botões, redesenhos de tela e opções de orientação.Um segmento recebe um
Looper
eMessageQueue
chamandoLooper.prepare()
após sua execução.Looper.prepare()
identifica o segmento de chamada, cria um Looper e umMessageQueue
objeto e associa o segmentoCÓDIGO DE AMOSTRA
Para mais informações, verifique abaixo do post
fonte