[ANDROID] จัดการกับ Instance State ให้อยู่หมัดด้วย Icepick


Icepick
Android Instance State made easy

          ก่อนจะมาดูเรื่อง Icepick library ขอพูดถึง Instance State แบบสั้นๆ ให้ฟังก่อนนะครับ สำหรับ Instance State จะเก็บอยู่ในลักษณะ Key-Value ใน Bundle ซึ่งสามารถทำการ Save และ Restore ได้
  • Save หรือ onSaveInstanceState() จะถูกเรียกเมื่อ Activity กำลังจะถูกทำลาย
  • Restore หรือ onRestoreInstanceState() จะถูกเรียกเมื่อ Activity ถูกสร้างขึ้นมาใหม่อีกครั้ง
ดังรูป


โดยปกติแล้ว Android จะทำการ Save/Restore Instance State ของ View ใน layout ของเราให้โดยอัตโนมัติ (โดยที่ View ต้องมี id)
ตัวอย่าง EditText ที่มีการกรอกข้อความไว้ เมื่อ Activity ถูกทำลายและสร้างขึ้นมาอีกครั้ง ข้อความใน EditText ก็จะกลับมาให้อัตโนมัติ (เมพ ป่ะหละ)
          เกริ่นไปสั้นๆ สำหรับ Instance State นะครับ ซึ่งหากต้องการรายละเอียดเพิ่มเติม แนะนำตามไปอ่านที่ Best Practices ของการ Save/Restore State ของ Activity และ Fragment ของพี่เนยได้เลยจ้า รายละเอียดพร้อมภาพประกอบเคลื่อน 3มิติ เว่อวี อลังการมาก!!

มาดูเรื่องเราของกันต่อ

การติดตั้ง

Icepick library มีการเพิ่ม repositories เข้าไปด้วยนะครับ
repositories {
  maven {url "https://clojars.org/repo/"}
}
หลังจากนั้นก็เพิ่ม dependencies
dependencies {
  compile 'frankiesardo:icepick:3.1.0'
  provided 'frankiesardo:icepick-processor:3.1.0'
}

การใช้งาน

เหมือน Save/Restore ปกติเลย เพิ่ม @State ในหน้าตัวแปรที่ต้องการ Save/Restore แค่นั้นเอง

class ExampleActivity extends Activity {
  @State
  String username; // จะทำการ Save/Restore ตัวแปรให้เอง

  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    Icepick.restoreInstanceState(this, savedInstanceState);
  }

  @Override
  public void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    Icepick.saveInstanceState(this, outState);
  }
}

และยังเอาไปใช้ในการ Custom View ได้อีกด้วย
class CustomView extends View {
  @State
  int selectedPosition;

  @Override
  public Parcelable onSaveInstanceState() {
    return Icepick.saveInstanceState(this, super.onSaveInstanceState());
  }

  @Override
  public void onRestoreInstanceState(Parcelable state) {
    super.onRestoreInstanceState(Icepick.restoreInstanceState(this, state));
  }
}
          เป็นยังไงบ้างครับสำหรับ Icepick library สำหรับผมลองใช้ดูก็ทำให้รู้ว่า "ชีวิตดี๊ดี" แล้วเพื่อนๆ หละครับลองใช้แล้วเป็นยังไงกันบ้างเอาแชร์กันได้ใน Comment นะครับ สวัสดีครับ

ลิงค์อ้างอิง

Github : Icepick : Android Instance State made easy
novoda.com : THE MAKING OF ICEPICK: THE GOOD, THE BAD AND THE UGLY
developer.android.com : Recreating an Activity
inthecheesefactory.com : Best Practices ของการ Save/Restore State ของ Activity และ Fragment
trickyandroid.com : Saving Android View state correctly

Teeranai P

Developer ตัวน้อยๆ ที่หลงใหลในโลกของการพัฒนา Software. รักการเขียนโปรแกรมเป็นอันดับ 2 รองลงมาจากการนอน