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

หลังจากปล่อย FAIL in THAI 1.2 ออกไป ก็เริ่มเพิ่มความสามารถต่าง ๆ ให้กับมัน ซึ่งที่เล็งไว้อย่างแรกคือ การอ่านคอมเม้น เพราะพบว่า หลายคนคอมเม้นได้ฮามาก ๆ (ถ้าไม่นับมุกซ้ำ ๆ ที่เล่นกันจนเกลื่อน) อันนี้ไม่รู้ว่าผมเส้นตื้นเองหรือเปล่านะ แต่เอาเถอะ อันนี้คือว่าตั้งใจแรกแล้วกัน พอทำไปทำมา ก็เปลี่ยนกลวิธีกันหลายอย่างจนสุดท้าย ได้อย่างที่เห็น ดีขึ้น หรือแย่ลง อันนี้ก็แล้วแต่คนมอง ส่วนตัวผม ผมว่ามันดีขึ้นนะ (เข้าข้างตัวเองหน่อยสิ)

สรุปการเปลี่ยนแปลงเชิงเทคนิค มีทั้งหมดดังนี้ ใครที่ไม่เคยลองเขียนโปรแกรมคงจะงงสักหน่อย

  • เอา Swipe Detector + Swipe Interface ออกไป แล้วเปลี่ยนมาใช้ View Pager แทน เพื่อความสะดวกในการทำ animation
  • View Pager ที่ทาง Google แนะนำ ให้ใช้เป็น Fragment แต่ผมมองว่าไม่จำเป็น และกำหนดการดาวโหลดเนื้อหาได้ยากกว่าเลยใช้เป็น View ธรรมดาแทน โดยอ่านวิธีการจากเว็บนี้ และพอเข้าใจว่า View Pager มันก็คือ List View ประเภทหนึ่ง สร้าง Adapter ให้มัน และเรียกใช้ inflater ให้ถูกต้องก็ใช้ได้แล้ว (แต่อย่าลืมเรื่องการจัดการแรมนะ)
  • ใช้ ActionBarSherlock เพื่อทำให้ Android รุ่นเก่า ๆ มีหน้าตาเหมือนกับรุ่นใหม่ ๆ (และจะสามารถใช้ action menu ได้ด้วย) การใช้ ActionBarSherlock มีอยู่ 2 วิธี (สำหรับ eclipse) คือ
    • เพิ่มโดยการใช้ source
      1. ดาวโหลดไฟล์จากเว็บมามาแตกเก็บไว้
      2. สร้าง Android Project โดยเลือก from existing source
      3. เลือกโฟลเดอร์ library จากโฟลเดอร์ที่แตกไว้
      4. จะเปลี่ยนชื่อโปรเจคสักหน่อย แล้วดู Project Properties แล้วดูที่ Android > ส่วน Library ดูว่าติ๊ก เป็น Is Library อยู่หรือยัง ถ้ายังก็ติ๊กเสีย
      5. กลับไปดูโปรเจคของเรา แล้วก็ลบไฟล์ android-suport-v4.jar ใน library ทิ้ง
      6. เปิด Properties ของโปรเจคของเรา ไปดูที่ Android > Library แล้วเพิ่ม Library เข้ามาโดยคลิก Add แล้วเลือกโปรเจคของ ActionBarSherlock (ตั้งชื่ออะไรไว้ก็ชื่อนั้นแหละ)
      7. ถ้าต้องการใช้ support library รุ่นล่าสุดของเราเอง ก็ให้คัดลอกไฟล์ android-support-v4.jar จาก [Android SDK Folder]\extras\android\support\v4 มาใส่ในโฟลเดอร์ libs ของโปรเจค ActionBarSherlock
    • เพิ่มโดยการใช้ library (.jar)
      1. ให้ทำ 4 ขั้นตอนแรก เหมือนกับที่ใช้จาก source
      2. สั่ง export โปรเจค ActionBarSherlock เป็น JAR file (อันนี้ไม่แน่ใจนะ แต่ผมเอา AndroidManifest ออกตอนเลือกไฟล์ก่อน export เพื่อป้องกันการมี manifest ซ้ำซ้อน)
      3. คัดลอกไฟล์ .jar ที่ export ไว้เข้ามาในโปรเจคของเรา
    • หลังจากนั้นก็แก้คลาสที่ extends จาก Activity ของ support library มาเป็นของ ActionBarSherlock รวมทั้งคลาส Menu และ MenuItem ด้วย (อาจจะมีอื่น ๆ ลองหาดูแล้วกัน โดยสังเกตตรงที่ ถ้าไม่สามารถ Override ได้แสดงว่า Import library มาผิด)
    • เปลี่ยนธีมของแอพใน manifest ใหม่ให้เป็น @style/Theme.Sherlock(.*) แบบต่าง ๆ ตามต้องการ หรือถ้าสร้างธีมขึ้นมาเอง ต้อง extends จากธีมเหล่านี้ด้วย
    • ผมเลือกแบบ source เพราะจะได้อัพเดทได้ง่าย ๆ แตกไฟล์ใหม่ สั่ง export โปรเจคของตัวเองก็จะได้รุ่นล่าสุดโดยไม่ต้องสร้าง .jar ให้วุ่นวาย
  • ทำ action menu สำหรับ เปิดหน้าเว็บด้วยวิธีปกติ ส่วนสำหรับแชร์ ทาง Google แนะนำให้ใช้ ShareActionProvider หากใช้ View Pager จะต้องตั้งค่า setShareIntent() มาจาก fragment แต่ผมไม่ได้ใช้ fragment เลยต้องพึ่ง OnPageChangeListener.OnPageSelected() แทน ดูตัวอย่างตามนี้
  • ใช้ List View ในการแสดงคอมเม้นท์ ส่วนรูปภาพ และชื่อ + รายละเอียดของเฟล ก็ใช้ความเมธอด addHeaderView() ของ ListView เพิ่ม View ที่ inflate จาก layout (หรือจะสร้างเองก็ตามใจ) เข้าไป (ไม่เคยรู้ว่าทำแบบนี้ได้ด้วย โง่อยู่ตั้งนาน)
  • การใช้ List View ใน View Pager แรก ๆ งงนิดหน่อย หลัง ๆ จึงเข้าใจว่า Adapter ของทั้งคู่ไม่เกี่ยวกัน เวลาแก้ไขการแสดงผลของ page ก็ไม่ต้องไปสนใจว่านี่มันอยู่ใน Adapter ก็หมดปัญหา (มันไม่มีปัญหาอะไรหรอก ผมรู้สึกเหมือน inception ไปเอง)
  • ไอคอนสำหรับ action bar สามารถสร้างได้ด้วยเว็บ Android UI Utilities (คำเตือน: Chome Only!)
  • คอมเม้นท์ที่เป็นของ Facebook Comment สร้างเข้าถึงได้ผ่าน http://www.facebook.com/plugins/comments.php?href=<URL> แต่มันจะอิงภาษาตามที่อยู่ของเรา (ยังไม่ได้ค้นหาว่าใช้ api ได้ไหม?)
  • เพิ่ม Response Cache เข้ามา
  • เปลี่ยน Action Bar เป็นสีเหลืองตามธีมเว็บที่ใช้สีเหลือง และแก้กรอบสีเทา ๆ ของ share menu (ถ้าใครเคยใช้ ActionBarSherlock ที่เป็น .Light หรือ .DarkActionBar น่าจะเคยเจอ) อันนี้เขียนสไตล์เอา ถ้านึกไม่ออกว่าจะ override อันไหนก็เปิดไฟล์ abs__styles.xml กับ abs__themes.xml ใน ActionBarSherlock ดูโลด
  • ปิดไม่ให้ ListView แสดง highlight เวลาเตะบนรายการนั้น ๆ (เพราะผมไม่ได้ต้องการให้เลือกความเห็นแล้วทำอะไรต่อ) แต่การปิดมันยุ่งยากกว่าที่คิด คือ
    • สำหรับรายการความเห็นต่าง ๆ ให้ override เมธอด isEnabled() ให้คืนค่ากลับเป็น false อย่างเดียว
    • สำหรับ header หรือ footer ตอนเพิ่มเข้ารายการให้เลือกเมธอดที่รับ 3 ตัวแปร แล้วกำหนดตัวแปรสุดท้ายเป็น false (ตัวที่สองเป็น null หาก inflate แล้วก็อัพเดท view เอง) แบบนี้ addHeaderView(header, null, false) หรือ addFooterView(footer, null, false)
  • เปลี่ยนมาใช้ View Holder เพื่อทำให้ UI ลื่นขึ้น โดยลดภาระการพึ่งพิง findViewById() ลองอ่านรายละเอียดเพิ่มเกี่ยวกับการเพิ่มประสิทธิภาพของ ListView ได้จากเอ็นทรี่นี้

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

ปัญหาที่หลังเหลืออยู่ก็จะเป็นเรื่องการจัดการแรมที่ต้องนี้ปล่อยให้มันกินแรมไปเรื่อย ๆ ก่อน รุ่นถัดไป อาจจะเก็บลง LruCache (disk) แล้วเพื่อลดการใช้แรม แล้วค่อยดึงมันกลับมาภายหลัง และหาทางบอกผู้ใช้ว่ากำลังดาวโหลดเนื้อหาใหม่ให้ได้ (ลองทำ 2 - 3 วิธี แต่ยังไม่เวิร์ค เลยหยุดไว้ก่อน)

สิ่งที่เรียนรู้ และรู้ซึ้งชัดเจนที่สุดคงเป็นความหมายของคำว่า (we are) standing on the shoulders of giants — พวกเรากำลังยืนอยู่บนไหล่ของเหล่ายักษ์

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.