Salvando o estado utilizando o Icepick

(Last Updated On: 27 de abril de 2016)

Algo bem comum no Android é que queremos manter o estado atual quando fazemos a rotação do celular, como vimos nesse post !

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 no Alura temos uns cursos bem bacanas!

Fique por dentro

Próximo ArtigoO que um arquivo .java precisa para compilar?