SlideShare une entreprise Scribd logo
1  sur  24
Télécharger pour lire hors ligne
Como Reter Objetos Utilizando
Android-State API
thiengo.com.br
Retenção de objetos em aplicativos Android
A retenção de estados de objetos em aplicativos
Android é algo já trabalhado desde as primeiras
versões desta plataforma.
As estratégias que se destacam são: utilizando o
ViewModel ou utilizando o SaveInstanceState. Mas
também é possível trabalhar bases de dados locais
para isso, como, por exemplo: SharedPreferences,
SQLite ou Realm.
Não há uma solução superior a todas as outras, há a
que se encaixa melhor para um problema em
específico. O importante é permitir que objetos
trabalhados em atividades e fragmentos, ao menos
esses, não sejam criados novamente devido a
reconstrução de algum destes componentes Android.
A reconstrução de objetos não deve ser uma
preocupação somente caso não tenha o mínimo
efeito na performance do aplicativo.
Evernote Android-State API
Histórico
O time de desenvolvimento do Evernote aprimorou
a API Icepick, API já famosa por conseguir, de
maneira trivial, salvar o estado de objetos de
atividades, fragmentos e visualizações. Com isso
surgiu a Android-State library.
A Android-State é mais robusta, funciona tanto para
projetos Java como para projetos Kotlin. Além de
não exigir que as propriedades sejam públicas, algo
que uma API não deve fazer: forçar
desenvolvedores a seguir o caminho dela de
arquitetura de software.
Como o Icepick, o Android-State também é de
código aberto. Importante ter em mente que o que o
Android-State faz é exatamente o que o Icepick faz,
mas abrangendo mais ramos, atacando as
limitações da Icepick API.
Ok, mas o que realmente essas APIs fazem?
Elas trabalham o SaveInstanceState para nós developers, evitando que tenhamos
de adicionar código boilerplate ao projeto.
Então ainda temos presente nestas bibliotecas as limitações do
SaveInstanceState?
Sim. Veja a tabela a seguir:
Android-State / Icepick ViewModel
Durabilidade dos dados em memória Maior Menor
Quantidade de dados (bytes) em memória Menor Maior
Auxílio de Interface para serialização e
desserialização de objetos
Sim Não
Lembrando que a tabela acima somente lhe ajuda a escolher qual a melhor API
para o seu domínio do problema.
Instalação da API
No Gradle App Level, ou build.gradle (Module: app), de seu projeto Android,
adicione as seguintes referências:
Logo depois sincronize o projeto. Pode ser que você tenha problemas de conflito
de API caso não esteja com a versão mais atual da Android Support APIs, logo,
caso ocorra, utilize como estratégia de correção de conflito: atualização da
Android Support APIs para a versão mais atual.
Na época da construção deste conteúdo a versão mais atual era a 27.1.0.
Utilizando via Application class
Para que seja possível manter o estado de instâncias em atividades e fragmentos
de todo o projeto, primeiro temos de criar uma classe Application customizada
com o StateSaver definido:
Depois devemos referencia-la no AndroidManifest.xml:
E assim utilizar a anotação @State nas entidades que queremos manter o estado:
Diferente da Icepick API, com Android-State as propriedades podem ser públicas
e privadas. No código acima a inicialização das propriedades não mais será
levada em conta caso haja uma reconstrução de atividade, somente os algoritmos
dentro, direta ou indiretamente, dos métodos de ciclo de vida da atividade.
A anotação funciona exatamente com a mesma sintaxe quando com fragmentos:
Importante: somente tipos de dados aceitos em objetos Bundle é que são
válidos de uso com o @State. São eles: String; todos os tipos primitivos; e
objetos de tipos que implementam Parcelable ou Serializable.
Utilizando somente em componentes necessários
Quando a necessidade de retenção de estado é somente em alguns componentes
do projeto, você pode ignorar a definição utilizando uma classe Application
customizada e assim utilizar os métodos restoreInstanceState() e
saveInstanceState() do StateSaver:
Note que o outState!! tem
as duas exclamações ao
final para que o code
inspector não acuse erro e
assim trave a compilação.
Isso, pois
StateSaver.saveInstanceS
tate() está esperando um
dado não null, porém para
não modificar a assinatura
nativa de
onSaveInstanceState()
optei por gerar uma
exceção caso o outState
seja nulo.
Para fragmentos a sintaxe é a mesma:
Utilizando com visualização
Para manter o estado de propriedades em visualizações é preciso o trabalho
explícito com a classe StateSaver na View, como a seguir:
Seguindo as indicações da documentação fica entendido que a definição global
de uso do Android-State, com uma classe Application, não funciona para estados
de propriedades em visualizações customizadas.
Visualizações customizadas? Sim, pois por padrão, ao menos para as Views de
entrada de dados, o sistema Android já mantém em tela o que foi informado pelo
usuário, isso caso haja reconstrução de atividade ou fragmento.
Envelopando objetos não aceitos em Bundle
Caso você entre em um domínio de problema onde será necessário manter o
estado de objetos de tipos que não implementam nem Parcelable e nem
Serializable, para isso você terá de criar uma classe envelopadora que
implemente Bundler<T>.
Esse tipo de situação é comum quando a tipo de objeto é de alguma das APIs de
terceiros vinculadas ao seu projeto. Veja a classe a seguir:
Assuma que os tipos Country e Date implementam ou o Parcelable ou o
Serializable. Mesmo assim para mantermos algum objeto do tipo Game teremos
de criar uma classe envelopadora (assuma que não podemos implementar em
Game as interfaces comentadas anteriormente).
Podemos criar a classe GamerBundler como classe envelopadora que
implementa Bundler<T>:
Agora, em uma atividade de exemplo, temos:
Note que caso você esteja em um domínio do problema onde seja necessária a
criação de mais de uma classe Bundler<T>, onde uma conterá a outra, para isso
recomendo que utilize o ViewModel como solução para retenção de estados de
objetos dos componentes Activity e Fragment.
Isso, pois você terá de criar uma outra rota para conseguir essa meta, por
exemplo: criar uma classe para conter todos os dados das classes que não
implementem as interfaces Parcelable e Serializable. Sendo assim a
simplicidade adquirida com a Android-State API é perdida favorecendo então a
escolha pelo ViewModel.
Caso você precise trabalhar com o tipo List<T>, vai notar que o compilador não
permitirá prosseguir, pois List<T> não tem em sua hierarquia o trabalho com
Parcelable ou Serializable. Para isso a biblioteca Android-State já tem como
nativas as seguintes classes envelopadoras:
- BundlerListParcelable;
- BundlerListCharSequence;
- BundlerListString;
- BundlerListInteger.
Exemplo:
Trabalhando com reflexão
Se por algum motivo as propriedades que devem ser mantidas são privadas e
você não pode fornecer os métodos getter e setter delas, terá de utilizar a
anotação @StateReflection para mante-las. Trabalho com reflexão, algo
recomendado pela API somente quando não há outra alternativa:
Proguard
Caso esteja com o Proguard ativo, terá de colocar as seguintes definições em
proguard-rules.pro:
Pontos negativos
- A API não permite o trabalho com classes Bundler<T> internas a outras classes
que implementem Bundler<T>;
- Para realmente entender a API Android-State é preciso ler também a
documentação da API Icepick;
- Na documentação não fala nada sobre as limitações da API devido ao uso
interno do SaveInstanceState, algo que um developer precisa saber para não
cometer o erro de tentar salvar listas com centenas de objetos pesados em
memória.
Pontos positivos
- Muito mais simples de utilizar do que qualquer uma das outras soluções Android
para retenção de estado de objetos de atividades, fragmentos e visualizações;
- Funciona para todas as versões Android ainda em mercado;
- Quando necessária, a criação de classe Bundler<T> ainda mantém o uso da
API sendo simples;
- Tem definições para o Lint Tool que facilitam o uso da API no Android Studio.
Conclusão
A Android-State API é simples, isso induz ao seu uso, mas há casos onde é
prudente realizar testes de carga, pois é a API SaveInstanceState que está sendo
utilizada "por debaixo dos panos" e sabemos da limitação de espaço em memória
para está API.
Para projetos onde os dados são pouco ou nada dinâmicos e mesmo assim não
devem passar pelas reconstruções de atividades, fragmentos e visualizações,
seguramente recomendo Android-State. Para outras situações: ficaria com o
ViewModel. Também por esta API fazer parte da arquitetura recomendada pelo
Google Android.
Fontes
Conteúdo completo, em texto e em vídeo, no link a seguir:
- https://www.thiengo.com.br/como-reter-objetos-utilizando-android-state-api
Fontes:
- https://github.com/evernote/android-state
- https://github.com/frankiesardo/icepick
Para estudo
- Treinamento oficial:
- Prototipagem Profissional de Aplicativos Android.
- Meus livros:
- Receitas Para Desenvolvedores Android;
- Refatorando Para Programas Limpos.
- Redes:
- Udemy;
- YouTube;
- Facebook;
- LinkedIn;
- GitHub;
- Twitter;
- Google Plus.
- Blog App.
Como Reter Objetos Utilizando
Android-State API
thiengo.com.br
Vinícius Thiengo
thiengocalopsita@gmail.com

Contenu connexe

Tendances

Android About Page API Para Construir a Tela Sobre
Android About Page API Para Construir a Tela SobreAndroid About Page API Para Construir a Tela Sobre
Android About Page API Para Construir a Tela SobreVinícius Thiengo
 
SelectionTracker Para Seleção de Itens no RecyclerView Android
SelectionTracker Para Seleção de Itens no RecyclerView AndroidSelectionTracker Para Seleção de Itens no RecyclerView Android
SelectionTracker Para Seleção de Itens no RecyclerView AndroidVinícius Thiengo
 
Observable Binding Para Atualização na UI Android
Observable Binding Para Atualização na UI AndroidObservable Binding Para Atualização na UI Android
Observable Binding Para Atualização na UI AndroidVinícius Thiengo
 
Live Templates Para Otimização de Tempo no Android Studio
Live Templates Para Otimização de Tempo no Android StudioLive Templates Para Otimização de Tempo no Android Studio
Live Templates Para Otimização de Tempo no Android StudioVinícius Thiengo
 
PhotoView Android Para a Completa Implementação de Zoom
PhotoView Android Para a Completa Implementação de ZoomPhotoView Android Para a Completa Implementação de Zoom
PhotoView Android Para a Completa Implementação de ZoomVinícius Thiengo
 
Estudando Android - Lista de Conteúdos do Blog
Estudando Android - Lista de Conteúdos do BlogEstudando Android - Lista de Conteúdos do Blog
Estudando Android - Lista de Conteúdos do BlogVinícius Thiengo
 
Como Impulsionar o App Android - Compartilhamento Nativo
Como Impulsionar o App Android - Compartilhamento NativoComo Impulsionar o App Android - Compartilhamento Nativo
Como Impulsionar o App Android - Compartilhamento NativoVinícius Thiengo
 
Android DevConference - Automatizando testes sem sofrimento
Android DevConference - Automatizando testes sem sofrimentoAndroid DevConference - Automatizando testes sem sofrimento
Android DevConference - Automatizando testes sem sofrimentoiMasters
 
Básico sobre Debugging com Java
Básico sobre Debugging com JavaBásico sobre Debugging com Java
Básico sobre Debugging com JavajesuinoPower
 
Annotation Span Para Estilização de Texto no Android
Annotation Span Para Estilização de Texto no AndroidAnnotation Span Para Estilização de Texto no Android
Annotation Span Para Estilização de Texto no AndroidVinícius Thiengo
 
Dez dicas para_acompanhamento_de_bugs
Dez dicas para_acompanhamento_de_bugsDez dicas para_acompanhamento_de_bugs
Dez dicas para_acompanhamento_de_bugsPaulo Mattos
 
Android Studio: Primeiros Passos
Android Studio: Primeiros PassosAndroid Studio: Primeiros Passos
Android Studio: Primeiros PassosRomualdo Andre
 
Java Fx Guia De IntroduçãO
Java Fx Guia De IntroduçãOJava Fx Guia De IntroduçãO
Java Fx Guia De IntroduçãOdanielfc
 
Indo além com Automação de Testes de Apps Android
Indo além com Automação de Testes de Apps AndroidIndo além com Automação de Testes de Apps Android
Indo além com Automação de Testes de Apps AndroidEduardo Carrara de Araujo
 
Artigo Automação de testes funcionais com Demoiselle Behave
Artigo Automação de testes funcionais com Demoiselle BehaveArtigo Automação de testes funcionais com Demoiselle Behave
Artigo Automação de testes funcionais com Demoiselle BehaveJulian Cesar
 
Android N, Java 8, Android Studio 2.2?
Android N, Java 8, Android Studio 2.2?Android N, Java 8, Android Studio 2.2?
Android N, Java 8, Android Studio 2.2?Marcelo Quinta
 

Tendances (20)

Android About Page API Para Construir a Tela Sobre
Android About Page API Para Construir a Tela SobreAndroid About Page API Para Construir a Tela Sobre
Android About Page API Para Construir a Tela Sobre
 
SelectionTracker Para Seleção de Itens no RecyclerView Android
SelectionTracker Para Seleção de Itens no RecyclerView AndroidSelectionTracker Para Seleção de Itens no RecyclerView Android
SelectionTracker Para Seleção de Itens no RecyclerView Android
 
Observable Binding Para Atualização na UI Android
Observable Binding Para Atualização na UI AndroidObservable Binding Para Atualização na UI Android
Observable Binding Para Atualização na UI Android
 
Live Templates Para Otimização de Tempo no Android Studio
Live Templates Para Otimização de Tempo no Android StudioLive Templates Para Otimização de Tempo no Android Studio
Live Templates Para Otimização de Tempo no Android Studio
 
PhotoView Android Para a Completa Implementação de Zoom
PhotoView Android Para a Completa Implementação de ZoomPhotoView Android Para a Completa Implementação de Zoom
PhotoView Android Para a Completa Implementação de Zoom
 
Android Studio
Android StudioAndroid Studio
Android Studio
 
Estudando Android - Lista de Conteúdos do Blog
Estudando Android - Lista de Conteúdos do BlogEstudando Android - Lista de Conteúdos do Blog
Estudando Android - Lista de Conteúdos do Blog
 
Como Impulsionar o App Android - Compartilhamento Nativo
Como Impulsionar o App Android - Compartilhamento NativoComo Impulsionar o App Android - Compartilhamento Nativo
Como Impulsionar o App Android - Compartilhamento Nativo
 
Android DevConference - Automatizando testes sem sofrimento
Android DevConference - Automatizando testes sem sofrimentoAndroid DevConference - Automatizando testes sem sofrimento
Android DevConference - Automatizando testes sem sofrimento
 
Básico sobre Debugging com Java
Básico sobre Debugging com JavaBásico sobre Debugging com Java
Básico sobre Debugging com Java
 
Annotation Span Para Estilização de Texto no Android
Annotation Span Para Estilização de Texto no AndroidAnnotation Span Para Estilização de Texto no Android
Annotation Span Para Estilização de Texto no Android
 
Dez dicas para_acompanhamento_de_bugs
Dez dicas para_acompanhamento_de_bugsDez dicas para_acompanhamento_de_bugs
Dez dicas para_acompanhamento_de_bugs
 
Android Studio: Primeiros Passos
Android Studio: Primeiros PassosAndroid Studio: Primeiros Passos
Android Studio: Primeiros Passos
 
Grails
GrailsGrails
Grails
 
Java script
Java scriptJava script
Java script
 
Java Fx Guia De IntroduçãO
Java Fx Guia De IntroduçãOJava Fx Guia De IntroduçãO
Java Fx Guia De IntroduçãO
 
Indo além com Automação de Testes de Apps Android
Indo além com Automação de Testes de Apps AndroidIndo além com Automação de Testes de Apps Android
Indo além com Automação de Testes de Apps Android
 
Artigo Automação de testes funcionais com Demoiselle Behave
Artigo Automação de testes funcionais com Demoiselle BehaveArtigo Automação de testes funcionais com Demoiselle Behave
Artigo Automação de testes funcionais com Demoiselle Behave
 
Android N, Java 8, Android Studio 2.2?
Android N, Java 8, Android Studio 2.2?Android N, Java 8, Android Studio 2.2?
Android N, Java 8, Android Studio 2.2?
 
Apostila sobre o Visualg
Apostila sobre o VisualgApostila sobre o Visualg
Apostila sobre o Visualg
 

Similaire à Como Reter Objetos Utilizando Android-State API

Como criar interfaces gráficas com android
Como criar interfaces gráficas com androidComo criar interfaces gráficas com android
Como criar interfaces gráficas com androidRicardo Ogliari
 
Estudando Android - Lista de Conteúdos do Blog
Estudando Android - Lista de Conteúdos do BlogEstudando Android - Lista de Conteúdos do Blog
Estudando Android - Lista de Conteúdos do BlogVinícius Thiengo
 
Computação Móvel 2012.2 - Android
Computação Móvel 2012.2 - AndroidComputação Móvel 2012.2 - Android
Computação Móvel 2012.2 - AndroidTiago Bencardino
 
BottomNavigationView Android, Como e Quando Utilizar
BottomNavigationView Android, Como e Quando UtilizarBottomNavigationView Android, Como e Quando Utilizar
BottomNavigationView Android, Como e Quando UtilizarVinícius Thiengo
 
Data Binding Android - Levi Saturnino
Data Binding  Android - Levi SaturninoData Binding  Android - Levi Saturnino
Data Binding Android - Levi SaturninoLevi Saturnino
 
Orientação a Objetos no Delphi - Controle de Estoque (II)
Orientação a Objetos no Delphi - Controle de Estoque (II)Orientação a Objetos no Delphi - Controle de Estoque (II)
Orientação a Objetos no Delphi - Controle de Estoque (II)Ryan Padilha
 
Minicurso de Android
Minicurso de AndroidMinicurso de Android
Minicurso de AndroidEdgar Eler
 
Apresentacão Android Components - Programando em camadas
Apresentacão Android Components - Programando em camadasApresentacão Android Components - Programando em camadas
Apresentacão Android Components - Programando em camadasVictor Aldir
 
VSSUMMIT 2023 - Como partir do zero e entregar uma API Profissional com .NET ...
VSSUMMIT 2023 - Como partir do zero e entregar uma API Profissional com .NET ...VSSUMMIT 2023 - Como partir do zero e entregar uma API Profissional com .NET ...
VSSUMMIT 2023 - Como partir do zero e entregar uma API Profissional com .NET ...Dextra Sistemas / Etec Itu
 
Desenvolvimento de Apps e Games para Android - Parte 4
Desenvolvimento de Apps e Games para Android - Parte 4Desenvolvimento de Apps e Games para Android - Parte 4
Desenvolvimento de Apps e Games para Android - Parte 4Erisvaldo Junior
 
Html5 pt - Offline Apps
Html5 pt - Offline AppsHtml5 pt - Offline Apps
Html5 pt - Offline AppsByclosure
 
Android Banco de Dados
Android Banco de DadosAndroid Banco de Dados
Android Banco de DadosAlex Braz
 

Similaire à Como Reter Objetos Utilizando Android-State API (20)

Como criar interfaces gráficas com android
Como criar interfaces gráficas com androidComo criar interfaces gráficas com android
Como criar interfaces gráficas com android
 
Apostila Android
Apostila AndroidApostila Android
Apostila Android
 
Estudando Android - Lista de Conteúdos do Blog
Estudando Android - Lista de Conteúdos do BlogEstudando Android - Lista de Conteúdos do Blog
Estudando Android - Lista de Conteúdos do Blog
 
Computação Móvel 2012.2 - Android
Computação Móvel 2012.2 - AndroidComputação Móvel 2012.2 - Android
Computação Móvel 2012.2 - Android
 
BottomNavigationView Android, Como e Quando Utilizar
BottomNavigationView Android, Como e Quando UtilizarBottomNavigationView Android, Como e Quando Utilizar
BottomNavigationView Android, Como e Quando Utilizar
 
Data Binding Android - Levi Saturnino
Data Binding  Android - Levi SaturninoData Binding  Android - Levi Saturnino
Data Binding Android - Levi Saturnino
 
Orientação a Objetos no Delphi - Controle de Estoque (II)
Orientação a Objetos no Delphi - Controle de Estoque (II)Orientação a Objetos no Delphi - Controle de Estoque (II)
Orientação a Objetos no Delphi - Controle de Estoque (II)
 
Angular 2
Angular 2Angular 2
Angular 2
 
Minicurso de Android
Minicurso de AndroidMinicurso de Android
Minicurso de Android
 
Androi studio
Androi studioAndroi studio
Androi studio
 
Apresentacão Android Components - Programando em camadas
Apresentacão Android Components - Programando em camadasApresentacão Android Components - Programando em camadas
Apresentacão Android Components - Programando em camadas
 
Iniciando com realm
Iniciando com realmIniciando com realm
Iniciando com realm
 
VSSUMMIT 2023 - Como partir do zero e entregar uma API Profissional com .NET ...
VSSUMMIT 2023 - Como partir do zero e entregar uma API Profissional com .NET ...VSSUMMIT 2023 - Como partir do zero e entregar uma API Profissional com .NET ...
VSSUMMIT 2023 - Como partir do zero e entregar uma API Profissional com .NET ...
 
Introdução ao Android Studio
Introdução ao Android StudioIntrodução ao Android Studio
Introdução ao Android Studio
 
Desenvolvimento de Apps e Games para Android - Parte 4
Desenvolvimento de Apps e Games para Android - Parte 4Desenvolvimento de Apps e Games para Android - Parte 4
Desenvolvimento de Apps e Games para Android - Parte 4
 
Hello World Android
Hello World AndroidHello World Android
Hello World Android
 
gae
gaegae
gae
 
Html5 pt - Offline Apps
Html5 pt - Offline AppsHtml5 pt - Offline Apps
Html5 pt - Offline Apps
 
Android Banco de Dados
Android Banco de DadosAndroid Banco de Dados
Android Banco de Dados
 
Sap
SapSap
Sap
 

Plus de Vinícius Thiengo

Android: Qual Tecnologia de Desenvolvimento Utilizar?
Android: Qual Tecnologia de Desenvolvimento Utilizar?Android: Qual Tecnologia de Desenvolvimento Utilizar?
Android: Qual Tecnologia de Desenvolvimento Utilizar?Vinícius Thiengo
 
7 Livros Que Não São de TI, Mas Que Um Programador Deveria Ler
7 Livros Que Não São de TI, Mas Que Um Programador Deveria Ler7 Livros Que Não São de TI, Mas Que Um Programador Deveria Ler
7 Livros Que Não São de TI, Mas Que Um Programador Deveria LerVinícius Thiengo
 
5 livros que não são de TI, mas que um desenvolvedor deveria ler
5 livros que não são de TI, mas que um desenvolvedor deveria ler5 livros que não são de TI, mas que um desenvolvedor deveria ler
5 livros que não são de TI, mas que um desenvolvedor deveria lerVinícius Thiengo
 
Utilizando Intenções Para Mapas de Alta Qualidade no Android
Utilizando Intenções Para Mapas de Alta Qualidade no AndroidUtilizando Intenções Para Mapas de Alta Qualidade no Android
Utilizando Intenções Para Mapas de Alta Qualidade no AndroidVinícius Thiengo
 
Chips Android, Quando e Como Utilizar
Chips Android, Quando e Como UtilizarChips Android, Quando e Como Utilizar
Chips Android, Quando e Como UtilizarVinícius Thiengo
 
Android: Avaliação do Pré-projeto Agenda Cultural
Android: Avaliação do Pré-projeto Agenda CulturalAndroid: Avaliação do Pré-projeto Agenda Cultural
Android: Avaliação do Pré-projeto Agenda CulturalVinícius Thiengo
 
Definindo Fontes em Aplicativos Android
Definindo Fontes em Aplicativos AndroidDefinindo Fontes em Aplicativos Android
Definindo Fontes em Aplicativos AndroidVinícius Thiengo
 
Fontes em XML, Android O. Configuração e Uso
Fontes em XML, Android O. Configuração e UsoFontes em XML, Android O. Configuração e Uso
Fontes em XML, Android O. Configuração e UsoVinícius Thiengo
 

Plus de Vinícius Thiengo (10)

Android: Qual Tecnologia de Desenvolvimento Utilizar?
Android: Qual Tecnologia de Desenvolvimento Utilizar?Android: Qual Tecnologia de Desenvolvimento Utilizar?
Android: Qual Tecnologia de Desenvolvimento Utilizar?
 
7 Livros Que Não São de TI, Mas Que Um Programador Deveria Ler
7 Livros Que Não São de TI, Mas Que Um Programador Deveria Ler7 Livros Que Não São de TI, Mas Que Um Programador Deveria Ler
7 Livros Que Não São de TI, Mas Que Um Programador Deveria Ler
 
5 livros que não são de TI, mas que um desenvolvedor deveria ler
5 livros que não são de TI, mas que um desenvolvedor deveria ler5 livros que não são de TI, mas que um desenvolvedor deveria ler
5 livros que não são de TI, mas que um desenvolvedor deveria ler
 
Utilizando Intenções Para Mapas de Alta Qualidade no Android
Utilizando Intenções Para Mapas de Alta Qualidade no AndroidUtilizando Intenções Para Mapas de Alta Qualidade no Android
Utilizando Intenções Para Mapas de Alta Qualidade no Android
 
Chips Android, Quando e Como Utilizar
Chips Android, Quando e Como UtilizarChips Android, Quando e Como Utilizar
Chips Android, Quando e Como Utilizar
 
Android: Avaliação do Pré-projeto Agenda Cultural
Android: Avaliação do Pré-projeto Agenda CulturalAndroid: Avaliação do Pré-projeto Agenda Cultural
Android: Avaliação do Pré-projeto Agenda Cultural
 
Freelancer Android
Freelancer AndroidFreelancer Android
Freelancer Android
 
Definindo Fontes em Aplicativos Android
Definindo Fontes em Aplicativos AndroidDefinindo Fontes em Aplicativos Android
Definindo Fontes em Aplicativos Android
 
Fontes em XML, Android O. Configuração e Uso
Fontes em XML, Android O. Configuração e UsoFontes em XML, Android O. Configuração e Uso
Fontes em XML, Android O. Configuração e Uso
 
Material Design
Material DesignMaterial Design
Material Design
 

Como Reter Objetos Utilizando Android-State API

  • 1. Como Reter Objetos Utilizando Android-State API thiengo.com.br
  • 2. Retenção de objetos em aplicativos Android A retenção de estados de objetos em aplicativos Android é algo já trabalhado desde as primeiras versões desta plataforma. As estratégias que se destacam são: utilizando o ViewModel ou utilizando o SaveInstanceState. Mas também é possível trabalhar bases de dados locais para isso, como, por exemplo: SharedPreferences, SQLite ou Realm. Não há uma solução superior a todas as outras, há a que se encaixa melhor para um problema em específico. O importante é permitir que objetos trabalhados em atividades e fragmentos, ao menos esses, não sejam criados novamente devido a reconstrução de algum destes componentes Android. A reconstrução de objetos não deve ser uma preocupação somente caso não tenha o mínimo efeito na performance do aplicativo.
  • 4. Histórico O time de desenvolvimento do Evernote aprimorou a API Icepick, API já famosa por conseguir, de maneira trivial, salvar o estado de objetos de atividades, fragmentos e visualizações. Com isso surgiu a Android-State library. A Android-State é mais robusta, funciona tanto para projetos Java como para projetos Kotlin. Além de não exigir que as propriedades sejam públicas, algo que uma API não deve fazer: forçar desenvolvedores a seguir o caminho dela de arquitetura de software. Como o Icepick, o Android-State também é de código aberto. Importante ter em mente que o que o Android-State faz é exatamente o que o Icepick faz, mas abrangendo mais ramos, atacando as limitações da Icepick API.
  • 5. Ok, mas o que realmente essas APIs fazem? Elas trabalham o SaveInstanceState para nós developers, evitando que tenhamos de adicionar código boilerplate ao projeto. Então ainda temos presente nestas bibliotecas as limitações do SaveInstanceState? Sim. Veja a tabela a seguir: Android-State / Icepick ViewModel Durabilidade dos dados em memória Maior Menor Quantidade de dados (bytes) em memória Menor Maior Auxílio de Interface para serialização e desserialização de objetos Sim Não Lembrando que a tabela acima somente lhe ajuda a escolher qual a melhor API para o seu domínio do problema.
  • 6. Instalação da API No Gradle App Level, ou build.gradle (Module: app), de seu projeto Android, adicione as seguintes referências: Logo depois sincronize o projeto. Pode ser que você tenha problemas de conflito de API caso não esteja com a versão mais atual da Android Support APIs, logo, caso ocorra, utilize como estratégia de correção de conflito: atualização da Android Support APIs para a versão mais atual. Na época da construção deste conteúdo a versão mais atual era a 27.1.0.
  • 7. Utilizando via Application class Para que seja possível manter o estado de instâncias em atividades e fragmentos de todo o projeto, primeiro temos de criar uma classe Application customizada com o StateSaver definido: Depois devemos referencia-la no AndroidManifest.xml:
  • 8. E assim utilizar a anotação @State nas entidades que queremos manter o estado: Diferente da Icepick API, com Android-State as propriedades podem ser públicas e privadas. No código acima a inicialização das propriedades não mais será levada em conta caso haja uma reconstrução de atividade, somente os algoritmos dentro, direta ou indiretamente, dos métodos de ciclo de vida da atividade. A anotação funciona exatamente com a mesma sintaxe quando com fragmentos:
  • 9. Importante: somente tipos de dados aceitos em objetos Bundle é que são válidos de uso com o @State. São eles: String; todos os tipos primitivos; e objetos de tipos que implementam Parcelable ou Serializable.
  • 10. Utilizando somente em componentes necessários Quando a necessidade de retenção de estado é somente em alguns componentes do projeto, você pode ignorar a definição utilizando uma classe Application customizada e assim utilizar os métodos restoreInstanceState() e saveInstanceState() do StateSaver: Note que o outState!! tem as duas exclamações ao final para que o code inspector não acuse erro e assim trave a compilação. Isso, pois StateSaver.saveInstanceS tate() está esperando um dado não null, porém para não modificar a assinatura nativa de onSaveInstanceState() optei por gerar uma exceção caso o outState seja nulo.
  • 11. Para fragmentos a sintaxe é a mesma:
  • 12. Utilizando com visualização Para manter o estado de propriedades em visualizações é preciso o trabalho explícito com a classe StateSaver na View, como a seguir: Seguindo as indicações da documentação fica entendido que a definição global de uso do Android-State, com uma classe Application, não funciona para estados de propriedades em visualizações customizadas. Visualizações customizadas? Sim, pois por padrão, ao menos para as Views de entrada de dados, o sistema Android já mantém em tela o que foi informado pelo usuário, isso caso haja reconstrução de atividade ou fragmento.
  • 13. Envelopando objetos não aceitos em Bundle Caso você entre em um domínio de problema onde será necessário manter o estado de objetos de tipos que não implementam nem Parcelable e nem Serializable, para isso você terá de criar uma classe envelopadora que implemente Bundler<T>. Esse tipo de situação é comum quando a tipo de objeto é de alguma das APIs de terceiros vinculadas ao seu projeto. Veja a classe a seguir: Assuma que os tipos Country e Date implementam ou o Parcelable ou o Serializable. Mesmo assim para mantermos algum objeto do tipo Game teremos de criar uma classe envelopadora (assuma que não podemos implementar em Game as interfaces comentadas anteriormente).
  • 14. Podemos criar a classe GamerBundler como classe envelopadora que implementa Bundler<T>:
  • 15. Agora, em uma atividade de exemplo, temos: Note que caso você esteja em um domínio do problema onde seja necessária a criação de mais de uma classe Bundler<T>, onde uma conterá a outra, para isso recomendo que utilize o ViewModel como solução para retenção de estados de objetos dos componentes Activity e Fragment. Isso, pois você terá de criar uma outra rota para conseguir essa meta, por exemplo: criar uma classe para conter todos os dados das classes que não implementem as interfaces Parcelable e Serializable. Sendo assim a simplicidade adquirida com a Android-State API é perdida favorecendo então a escolha pelo ViewModel.
  • 16. Caso você precise trabalhar com o tipo List<T>, vai notar que o compilador não permitirá prosseguir, pois List<T> não tem em sua hierarquia o trabalho com Parcelable ou Serializable. Para isso a biblioteca Android-State já tem como nativas as seguintes classes envelopadoras: - BundlerListParcelable; - BundlerListCharSequence; - BundlerListString; - BundlerListInteger. Exemplo:
  • 17. Trabalhando com reflexão Se por algum motivo as propriedades que devem ser mantidas são privadas e você não pode fornecer os métodos getter e setter delas, terá de utilizar a anotação @StateReflection para mante-las. Trabalho com reflexão, algo recomendado pela API somente quando não há outra alternativa:
  • 18. Proguard Caso esteja com o Proguard ativo, terá de colocar as seguintes definições em proguard-rules.pro:
  • 19. Pontos negativos - A API não permite o trabalho com classes Bundler<T> internas a outras classes que implementem Bundler<T>; - Para realmente entender a API Android-State é preciso ler também a documentação da API Icepick; - Na documentação não fala nada sobre as limitações da API devido ao uso interno do SaveInstanceState, algo que um developer precisa saber para não cometer o erro de tentar salvar listas com centenas de objetos pesados em memória.
  • 20. Pontos positivos - Muito mais simples de utilizar do que qualquer uma das outras soluções Android para retenção de estado de objetos de atividades, fragmentos e visualizações; - Funciona para todas as versões Android ainda em mercado; - Quando necessária, a criação de classe Bundler<T> ainda mantém o uso da API sendo simples; - Tem definições para o Lint Tool que facilitam o uso da API no Android Studio.
  • 21. Conclusão A Android-State API é simples, isso induz ao seu uso, mas há casos onde é prudente realizar testes de carga, pois é a API SaveInstanceState que está sendo utilizada "por debaixo dos panos" e sabemos da limitação de espaço em memória para está API. Para projetos onde os dados são pouco ou nada dinâmicos e mesmo assim não devem passar pelas reconstruções de atividades, fragmentos e visualizações, seguramente recomendo Android-State. Para outras situações: ficaria com o ViewModel. Também por esta API fazer parte da arquitetura recomendada pelo Google Android.
  • 22. Fontes Conteúdo completo, em texto e em vídeo, no link a seguir: - https://www.thiengo.com.br/como-reter-objetos-utilizando-android-state-api Fontes: - https://github.com/evernote/android-state - https://github.com/frankiesardo/icepick
  • 23. Para estudo - Treinamento oficial: - Prototipagem Profissional de Aplicativos Android. - Meus livros: - Receitas Para Desenvolvedores Android; - Refatorando Para Programas Limpos. - Redes: - Udemy; - YouTube; - Facebook; - LinkedIn; - GitHub; - Twitter; - Google Plus. - Blog App.
  • 24. Como Reter Objetos Utilizando Android-State API thiengo.com.br Vinícius Thiengo thiengocalopsita@gmail.com