Salvando o estado utilizando o Icepick
Algo bem comum no Android é que queremos manter o estado atual quando fazemos a rotação do celular, como vimos nesse artigo !
Quando precisamos armazenar muitos objetos no momento que viramos a tela, por exemplo :
- uma lista;
- três fotos que foram tiradas e ainda não salvamos o seu caminho;
- o tempo que o usuário está naquela activity.
Vamos ver como ficaria o código para armazenarmos tudo isso :
@Override protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putString("foto1", caminhoFoto1);
outState.putString("foto2", caminhoFoto2);
outState.putString("foto3", caminhoFoto3);
outState.putSerializable("lista", lista);
outState.putLong("tempoInicial",tempoInicial);
// demais objetos que estamos guardando
}
Nada muito díficil, agora temos que restaurar tudo isso :
@Override protected void onRestoreInstanceState(Bundle savedInstanceState) { super.onRestoreInstanceState(savedInstanceState);
caminhoFoto1 = savedInstanceState.getString("foto1");
caminhoFoto2 = savedInstanceState.getString("foto2");
caminhoFoto3 = savedInstanceState.getString("foto3");
lista = (ArrayList<String>) savedInstanceState.getSerializable("lista");
tempoInicial = savedInstanceState.getLong("tempoInicial");
// demais objetos que estamos restaurando
}
Ah, está bem tranquilo até agora, mas vamos dificultar um pouquinho, pense que estamos numa tela um pouco mais complexa, que estamos tratando com muitas informações, nosso código ficaria muito grande, tanto para salvar o estado quanto para restaurar.
Para facilitar esse processo todo vamos utilizar uma API que vai resolver nosso problema, chamada Icepick.
Vamos traze-la para o nosso projeto, para isso iremos mexer no nosso gradle
:
dependencies { compile fileTree(include: \['\*.jar'\], dir: 'libs') testCompile 'junit:junit:4.12' compile 'com.android.support:appcompat-v7:23.3.0' compile 'com.github.frankiesardo:icepick:2.3.6' }
Legal, já trazemos a API agora vamos utiliza-la.
Precisamos informar quais são os objetos que queremos que sejam armazenados e restaurados, para isso usaremos uma Annotation
em cada objeto que será necessário persistir para aquela Activity
:
public class MainActivity extends AppCompatActivity {
@Icicle List<String> lista = new ArrayList<>();
@Icicle String foto1;
@Icicle String foto2;
@Icicle Long tempoInicial = System.currentTimeMillis();
//demais campos
}
Mas só anotar não é necessário, precisamos ter certeza que serão salvos e restaurados para isso temos que invocar alguns métodos que realizam esse procedimento :
@Override protected void onRestoreInstanceState(Bundle savedInstanceState) { super.onRestoreInstanceState(savedInstanceState);
Icepick.restoreInstanceState(this, savedInstanceState); }
@Override protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
Icepick.saveInstanceState(this, outState);
}
Através desses métodos todo aquele procedimento de colocar ou retirar o objeto do bundle
fica bem mais simples, pois quando anotamos os objetos, a própria API cria um identificador e utiliza no momento que salvamos e restauramos esses objetos.
Já imaginou que teríamos de fazer linha por linha para cada objeto que precisávamos guardar ? Dessa forma, todo aquele trabalho que teríamos para cada objeto, estamos substituindo em apenas uma única linha :)
Quer conhecer mais sobre Android ? Aqui na Alura temos vários cursos bem bacanas!