Aplicações Android normalmente precisam exibir algum tipo de dado em sua interface gráfica e muitas vezes precisam atualizar a interface quando esses dados são alterados. Para fazer essa ligação entre dados e interface gráfica precisamos recuperar uma referência para a View, setar o dado inicial, usar algum mecanismo para ser notificado de alteração nos dados e atualizar a interface gráfica quando esses dados forem alterados.
Data binding é um mecanismo pelo qual dados são conectados diretamente à interface do usuário e atualizações feitas nos dados são automaticamente refletidas na interface. Com esse mecanismo é possível diminuir muito o código necessário para a visualização e atualização dos dados, evitando erros comuns e facilitando a manutenção de seu código.
Algumas implementações de data binding também fazem a ligação inversa: alterações na interface atualizam automaticamente os dados. Quando há a ligação em ambas as direções, o mecanismo é chamado de two-way data binding (ligação de duas vias). Infelizmente a versão atual da biblioteca para Android não suporta a segunda via.
Nos tópicos a seguir veremos como a biblioteca de data binding usa a ferramenta Java de processamento de anotações para gerar o código que ligará o modelo à interface gráfica. Veremos também como o padrão de projeto observer é utilizado para receber notificações de alterações nos dados e como utilizar essa biblioteca em um projeto exemplo, que utilizará data binding para exibir uma lista de contatos.
Geração de código em Java
A biblioteca de data binding utiliza uma ferramenta do compilador Java para processar o seu código fonte e gerar novas classes que farão o meio de campo entre os seus dados e a sua interface. Essa ferramenta se chama processador de anotações (Annotation Processing) e existe desde a versão 5 do Java, porém se tornou mais estável e fácil de usar com o lançamento da versão 6.
Como o nome sugere, o processador de anotações irá analisar as anotações existentes em seu código fonte e gerar um novo código baseado nelas. Isso acontece em tempo de compilação e pode haver mais de uma rodada de processamento até que todas as anotações sejam processadas e todo o código necessário seja gerado.
O processador nada mais é que uma classe Java que implementa a interface javax.annotation.processing.Processor. Essa classe declara quais anotações ela está interessada em processar e recebe como entrada o código fonte original e um ambiente para que se possa gerar novo código. Após o processador terminar de gerar o código na primeira rodada, o compilador irá chamá-lo novamente com o código fonte original e o gerado na primeira rodada. Esse processo é repetido até que o processador não gere mais código.
Todo esse processamento acontece em tempo de compilação e não irá impactar a sua aplicação em tempo de execução. Isso faz com que processadores de anotações sejam ótimas ferramentas para eliminar a necessidade de escrever código manualmente para tarefas que são bem definidas e repetidas em vários pontos de sua aplicação.
No caso específico da biblioteca de data binding, o código gerado irá recuperar as views de seu layout que precisam ser preenchidas com dados, aplicar os dados iniciais a essas views e observar mudanças nos dados para que elas sejam atualizadas. Essas são tarefas bem definidas e que se repetem várias vezes nas Activities, Fragments e Adapters. Ter um robô que gera código acelera o desenvolvimento e diminui a ocorrência de bugs.
Outros exemplos de bibliotecas que usam os processadores de anotações e facilitam o desenvolvimento Android são:
- ButterKnife: elimina a necessidade de chamar findViewById() utilizando a anotação @InjectView em seus campos que referenciam views;
- Parceler: transforma seus POJOs em parcelables com a anotação @Parcel;
- Dagger: injeção de dependência sem utilizar reflection;
-
Ice ...
Quer ler esse conteúdo completo? Tenha acesso completo