กว่าจะมาเป็น FAIL in THAI 2.2

ก่อนหน้านี้มันมี FAIL in THAI รุ่น 2.1 ด้วย แต่ตอนนั้นแค่เพิ่มการรองรับแท็บเล็ตเข้าไป แล้วอัพขึ้นเซิฟเวอร์ แล้วทางกูเกิลบอกว่า มีปัญหา ให้ลองใหม่อีกครั้ง แต่ไป ๆ มา ๆ มันก็ปล่อยตัวนั้นออกไป (ซึ่งคงไม่มีปัญหาอะไรหรอกมั้ง...) ดังนั้น ขอเขียนรวบยอดเป็นส่วนหนึ่งของ รุ่น 2.2 ด้วยแล้วกัน

เนื่องจากรุ่นนี้เน้นการปรับปรุงประสิทธิภาพเป็นหลัก โดยมีข้อมูลทางเทคนิคดังนี้

รองรับแท็บเล็ต โดยการเขียน layout สำหรับแท็บเล็ตเพิ่ม แรก ๆ ก็งงพอสมควรเรื่องการแบ่งหน้าจอ ที่แบ่งเท่าไหร่ก็ไม่ได้ตามต้องการสักที แต่อ่านเรื่องการสร้าง fragment เขาเขียนเรื่อง weight (ในโค้ดสร้าง layout) เลยเอามาใช้ และพบว่ามันใช้ได้ดี แถมง่ายเอามาก ๆ

ลดการดาวโหลดข้อมูลลง โดยแทนที่จะดาวโหลดภาพจากอินเทอร์เน็ตใหม่ทุกครั้ง ก็เก็บภาพเหล่านั้นลงมือถือไว้ด้วย เมื่อเปิดดูเฟลเดิมก็ดึงภาพจากในเครื่องมาแสดงแทน ลดการใช้ข้อมูลดาต้า รวมทั้งเพิ่มความเร็วในการดาวโหลดข้อมูลได้ระดับหนึ่ง (ก็ไม่ต้องดาวโหลดรูปเดิม ๆ ซ้ำ ๆ ทุกครั้งที่เปิดแอพ)

  • ตามคำแนะนำของกูเกิล จะแนะนำให้ใช้ LruDiskCache แต่ผมเห็นว่า LruDiskCache ของ Jake Wharton น่าสนใจกว่า
  • แต่ผมก็ไม่ได้ใช้ทั้ง 2 วิธีข้างต้น แต่ใช้การบันทึกรูปลงโฟลเดอร์ cache ลงไปตรง ๆ เนื่องจากไม่ต้องแปลงไปแปลงมาให้เสียคุณภาพของรูป และใช้พื้นที่น้อยกว่า (แต่ถ้าออกแบบดี ๆ การใช้ LruDiskCache ก็น่าจะทำได้เช่นกัน และอาจจะดีกว่าด้วย?)

ลดการใช้แรมลง โดยการเอารูปออกจากแรมไปเมื่อผ่านไประยะหนึ่ง (คิดว่าคงไม่มีใครย้อนดูเฟลกลับไปกลับมากันบ่อย ๆ) โดยใช้ประโยชน์จากการที่ผมเก็บรูปลงในเครื่องไว้แล้ว จึงสามารถดึงมันกลับมาเมื่อต้องการใช้ได้ โดยใช้เทคนิคการอัพเดท view ที่แสดงอยู่บนหน้าจอเข้าช่วย ซึ่งอ่านมาจากเว็บแนะนำเกี่ยวกับ ViewPager เหมือนเดิม

เพิ่ม indicator (ภาษาไทยเรียกอะไรก็ไม่รู้) ว่ากำลังดาวโหลดข้อมูลอยู่ลงไปใน ActionBar โดยใช้วิธีนี้ (ดูดีกว่าที่กูเกิลทำให้เสียอีก) แต่ผมไม่ได้ทำปุ่ม refresh เลยปรับปรุงนิดหน่อย คือ

  • ตั้งปุ่มนั้นให้เป็น disable (enable = false)
  • กำหนด Action Layout ลงไปตั้งแต่เริ่มแรก (ใน menu editor)
  • ควบคุมโดยการซ่อน/แสดง ผ่าน setVisible() indicator เอาแทน ตรงนี้จะต้องทำบน UI Thread และมันจะมีปัญหา หากเรียกใช้ฟังชั่นนี้ผ่าน scheduler คือ ตัว scheduler จะค้าง แต่ไม่แจ้ง error อะไร ทางแก้คือเรียกใช้ runOnUiThread ใน AsyncTask แทน (ใช้ runOnUiThread() ในฟังชั่นที่ scheduler เรียกได้ไหม? ... ไม่รู้ ไม่ได้ลอง Orz)
  • และสุดท้าย ผมบังคับให้เมนูที่จำเป็นต้องใช้ใน ActionBar เป็น always (ซึ่งขัดกับ guide line ที่แนะนำให้เป็น ifRooms) ด้วยเหตุผลที่ว่า ไม่อยากให้เมนูมันผลุบ ๆ โผล่ ๆ ดูน่ารำคาญ

ปัญหาที่แก้ มีดังนี้

  • การดึงความเห็นจากระบบเก่า ตอนแรกคิดว่าเลือก tag และใช้ css selector ได้ไม่ผิดพลาดแล้ว แต่ไหงมันออกมาผิดพลาดอย่างไม่น่าให้อภัย (คิดถึงเรื่องนี้ไว้ตั้งแต่แรก แต่ยังพลาด!)
  • แก้ปัญหาเรื่อง force close (หลังจากปิดแอพไปแล้ว) เพราะตัว AsyncTask ยังทำงานอยู่ พอเสร็จก็เรียกใช้ฟังชั่นของ Activity แต่ Activity ถูกเก็บไปแล้ว ทางแก้คือใช้ WeakReference กับตัว view ที่จะใช้แล้วส่งมาให้ AsyncTask ตอนสร้าง (แต่บางอันที่ทำเพียงหนเดียว ไม่สำคัญมากนัก หรือต้องเรียกใช้ใน onResume() อยู่แล้ว ผมใช้วิธีตรวจสอบว่ามี Activity อยู่ไหม ถ้าไม่มีก็ปล่อยผ่าน)

ผลจะออกมาดีหรือไม่ดี อันนี้ต้องรอ feedback/comment แต่ถ้าไม่มีใครพูดถึงอะไร แสดงว่ามันดีแล้ว มาถูกทางแล้ว (หรือไม่ก็ ไม่มีใครสนใจ)

Get FAIL in THAI on Google Play

Add new comment

Plain text

  • No HTML tags allowed.
  • Web page addresses and e-mail addresses turn into links automatically.
  • Lines and paragraphs break automatically.
By submitting this form, you accept the Mollom privacy policy.