Icepickを使ってActivityの破棄に備える

やぎすけAdventCalendar2016 Android

Posted on Dec 8


こんにちは、やぎにいです。
やぎすけ Advent Calendar 2016の8日目です。 昨日は僕がButterKnifeを使ってソースコードのダイエットをするを書きました。

今日はAndroidプロジェクトを作って結構な確率で導入するライブラリで書いた4つ目のIcepickの使い方をまとめたいと思います。


導入

Icepickの導入もいつも通りbuild.gradleに以下を追加してあげます。

1
2
3
4
5
6
7
repositories {
  maven {url "https://clojars.org/repo/"}
}
dependencies {
  compile 'frankiesardo:icepick:3.2.0'
  provided 'frankiesardo:icepick-processor:3.2.0'
}

このライブラリもButterKnife同様、特にアプリケーションクラスでの初期化や設定などは必要ありません。build.gradleをに依存関係を追加したらあとは使うだけです。


Icepickとは

Androidアプリを開発するときに、アクティビティ(やフラグメントなどのUI系)の状態が変わるのを考慮してコードを書く思います。
ライフサイクルを調べて処理を書いたりすることが多々あると思いますが、意外なところで破棄されたりします。例えば端末を回転させたりとか(回転を抑制してない場合)すると簡単に破棄されたりします。
そこで困るのが、EditTextに入力していた値やTextViewで表示していた値が保持されなかったりすると、ユーザはもう一度値を入力しなきゃならなくなったりしてとても不便なアプリになってしまいます。

そんなときはonSaveInstanceStateメソッドとonRestoreInstanceStateメソッドをしっかり使って状態の保存復元を行います。
それを少し楽にさせるライブラリがIcepickになります。


使い方

簡単です、保持したい変数にアノテーション@StateをつけIcepick#saveInstanceStateIcepick#restoreInstanceStateを呼んであげるだけです。
実際にEditTextが1つ存在しており、その中の値を保持するようなソースを書いてみます。 (ついでにEditTextは昨日紹介したButterKnifeを使います)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
public class MainActivity extends AppCompatActivity implements RecyclerViewAdapter.Listener {

    @State String editTextValue;
    @BindView(R.id.editText1) EditText editText;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        ButterKnife.bind(this);
    }

    @Override
    protected void onSaveInstanceState(Bundle outState) {
      super.onSaveInstanceState(outState);

      editTextValue = editText.getText().toString();
      Icepick.saveInstanceState(this, outState);
    }

    @Override
    protected void onRestoreInstanceState(Bundle savedInstanceState) {
      super.onRestoreInstanceState(savedInstanceState);

      Icepick.restoreInstanceState(this, savedInstanceState);
      editText.setText(editTextValue);
    }
}

以上のような感じになります。
いちいちoutState.putString(KEY, VALUE);などをいっぱい書かずに@Stateアノテーション付きの変数にさえ入っていれば保持されるので楽になりました。
あんまりEditTextから値を取り出して変数へツッコミとすると保持したい物分の変数が増えるので、個人的にはButterKnife+Icepickなライブラリがほしいです。(@BindState EditText editTextとか書くとButterKnifeも使えるし、中の値もIcepick的に保持してくれるような感じで。)

おわりに

本日は短いですが、以上がIcepickの使い方になります。このライブラリもButterKnife同様、ソースコードのダイエットにとても貢献してくれるライブラリです。
onSaveInstanceStateでめちゃくちゃいっぱい描いちゃってる……みたいな方は導入の価値があると思います。が、ButterKnifeとはちょっと違って導入の場面を考えないと逆に変数が多くなってしまう……みたいなことになってしまうのでそこは十分にご注意を。

最後に注意としてIcepickはいろんなライブラリに依存しており芋づる式で追加されるのでメソッド数が少ない場合は注意です。Proguardを使う際はGithubのREADMEに設定が描いてあるのでそれを使ってあげましょう。

以上、やぎにいでした!


このエントリーをはてなブックマークに追加
comments powered by Disqus

<< Androidアプリ開発のちょっとした小ネタ     ButterKnifeを使ってソースコードのダイエットをする >>



2018やぎ小屋