จัดการ Startup Logic ให้อยู่หมัด ด้วย Jetpack App Startup

Peerapong Samarnpong
te<h @TDG
Published in
2 min readAug 27, 2020
Photo by SpaceX on Unsplash

เป็นเรื่องปกติที่ Library บางอย่างต้องมีการ Initialize ค่าบางอย่าง พร้อมกับการตอนเปิดแอป ซึ่งบาง Libraries ก็ใช้วิธีให้เพิ่มการ Initialize ใน Application class หรือ Libraries อย่าง WorkManager, Firebase ก็ทำการ Initialize ผ่าน Content Provider ไว้ให้เสร็จสรรพแล้ว

ซึ่งการมีหลาย Content Provider ก็อาจจะทำให้ เมื่อ User เปิดแอปขึ้นมา แอปอาจจะทำงานช้าลงได้ ดังนั้นก็เลยเกิดมี Library ที่ชื่อ Jetpack App Startup ขึ้นมา

Jetpack App Startup คืออะไร?

Jetpack App Startup คือ Library ที่ช่วยให้จัดการ การ Initialize Component ต่าง ๆ ตอนที่แอปเริ่มทำงาน ให้มีประสิทธิภาพและตรงไปตรงมา ซึ่งสามารถใช้งาน เพื่อกำหนดลำลับการทำงานได้อย่างชัดเจน และ App Startup ยังช่วยลดการใช้งาน Content Provider เพื่อลดเวลาในการเปิดใช้งานแอปลง โดยใช้แค่ Content Provider เดียวเพื่อจัดการการ Initialize Component ทั้งหมด

เริ่มใช้งาน Jetpack App Startup

เพิ่ม Dependency ใน build.gradle

สร้าง Component Initializer

สร้าง Class ที่ implement interface Initializer โดยมี method ที่สำคัญ 2 method คือ

  • create() เป็น method ที่ไว้กำหนดการ Initialize ของ Library ที่เราต้องการ
  • dependencies() เป็น method ที่เอาไว้กำหนดว่า Initializer นี้ต้องการ Dependency อะไรบ้าง ซึ่งจะเป็นตัวหนึ่งซึ่งกำหนดลำดับการทำงานของ Component ต่าง ๆ ว่าจะต้องรันอะไรขึ้นก่อนได้ เช่นถ้าหาก AInitializer ต้องการ BInitailizer และ BInitialier ก็ต้องการ CInitializer เป็น Dependency การทำงานก็จะเริ่มจาก CInitializer ตามด้วย BInitialier แล้วค่อยเป็น AInitializer เป็นอันดับสุดท้าย

ตัวอย่างเช่น เราต้องการสร้าง Initializer สำหรับWorkManager เราก็ตั้งชื่อเป็น WorkManagerInitializer โดย implement interface Initializer<WorkManager>

สังเกตได้ว่า method dependencies() นั้น Return เป็น Empty List เพราะว่า WorkManager ไม่ได้ต้องการ Library อื่นเป็น Dependency แต่อย่างใด

แต่ถ้าหากมี Library สักอย่างที่ต้องการ WorkManager เป็น Dependecy แล้วละก็. เราก็สามารถประกาศ Class ได้ประมาณนี้

App Startup จะทำการ Initialize WorkManager ก่อน ExampleLogger เพราะมีการกำหนดให้ WorkManagerInitializer เป็น Dependency ของ ExampleLoggerInitializer

กำหนดให้ Component Initializer ทำงานอัตโนมัติ

สำหรับ Component ที่เราต้องการให้เริ่มทำงานอัตโนมัติ สามารถเพิ่มใน <meta-data> ใน AndroidManifest.xml ได้

จะสังเกตได้ว่าเราไม่จำเป็นต้องใส่ WorkManagerInitializer เพราะ WorkManagerInitializer เป็น Dependency ของ ExampleLoggerInitializer นั่นหมายความว่า มันจะ Initialize ให้อัตโนมัติหาก ExampleLoggerInitializer ทำง

tools:node="merge" เป็นแอตทริบิวต์ ที่ช่วยจัดการเวลามีการตั้งค่าที่ขัดแย้งกันเกิดขึ้น

กำหนดให้ Component Initializer เมื่อต้องการ

ในบางครั้ง อาจจะไม่ได้ต้องการใน Component นั้นรันตอนที่แอปเริ่มทำงาน แต่อาจจะต้องการเมื่อ User ต้องการจะทำงานบางอย่าง เราก็สามารถกำหนดให้ Component นั้น Initialize เมื่อต้องการก็ได้ โดยลบ <meta-data> ของ Component นั้น ๆ ออกจาก AndroidMenifest.xml หรือจะใช้ tools:node=”remove" ในแทนการลบ <meta-data> ออกก็ได้เช่น

และสามารถเรียกใช้งานได้ด้วยคำสั่ง

โดย App Startup จะสร้าง WorkManager ให้ด้วยเพราะเป็น Dependency ของ ExampleLogger นั่นเอง และการทำงานนี้จะทำงานแค่ครั้งเดียว ถ้าเรามีการเรียก AppInitializer.initializecomponent() อีกครั้ง จะไม่มีการ Initialize Component ต่าง ๆ ให้อีก

สรุป

App Startup เป็น Library ที่ช่วยในการ Initialize Component ต่าง ๆ โดยใช้ Content Provider เดียวแทนที่จะใช้ Content Provider แยกกันหลาย ๆ ตัว ซึ่งช่วยลดเวลาในการเปิดแอปได้ สามารถกำหนดให้ทำงานได้อัตโนมัติ หรือว่า เรียกใช้งานเองเมื่อต้องการก็ได้

แหล่งข้อมูลอ้างอิง

--

--