Warning: in_array() expects parameter 2 to be array, string given in /home/content/31/10462331/html/babedev/blog/wp-content/plugins/facebook-button-plugin/facebook-button-plugin.php on line 380

Warning: in_array() expects parameter 2 to be array, string given in /home/content/31/10462331/html/babedev/blog/wp-content/plugins/facebook-button-plugin/facebook-button-plugin.php on line 383

เชื่อว่า Android developer ทุกคนจะต้องเคยเจอเรื่องปวดหัวเกี่ยวกับ fragmention ที่มีมากมายหลายแบบ และ bug แรกๆที่เจอหลังจาก publish app ไปแล้ว ก็คือปัญหาเรื่อง UI ที่แสดงไม่สมบูรณ์บนจอมือถือ Android หลายๆรุ่น

ซึ่งการ test UI/UX บน Android ให้ครบทุกรุ่นอุปกรณ์มันก็คงเป็นไปได้ยาก ครั้นจะไปกวาดมือถือหมด MBK ก็คงจะต้องใช้ทุนมหาศาล ไหนจะมีเรื่องปัญหา API level ต่างๆอีก ถ้าเผลออัพ version ไปแล้ว ก็ต้องมา downgrade ถ้าต้องการจะ test ระบบรุ่นเก่า

การแก้ปัญหาที่ง่ายสุดก็คือการใช้ emulator ซึ่งใน ADK นั้นมีมาให้พร้อมแล้ว แต่ว่าน่าเสียดายที่ emulator นี้ มันช่างอืดอาด เชื่องช้า แค่รอ boot อาจต้องรอถึง 10 กว่านาที ถึงขั้นว่าไปนั่งขี้ในห้องน้ำ อ่านการ์ตูนทั้งเล่ม เสร็จออกมา ก็ยัง boot ไม่เสร็จ

เพื่อแก้ปัญหานี้ เราเลยต้องไปให้ emulator ทางเลือก ซึ่งก็มีหลายเจ้าในท้องตลาด เช่น BlueStacks, You Wave, GenyMotion เหตุผลที่ผมเลือก GenyMotion ในวันนี้ เพราะได้ยินกิตติศัพท์มาว่า มันช่างรวดเร็ว ชนิดแค่หายใจสามเฮือก emulator ก็พร้อมใช้งาน เมื่อได้ยินดังนั้นก็ไม่รอช้า รีบจัดหามาลองอย่างไว

เริ่มแรกด้วยการ download จาก ที่นี้

การจะ download จะต้องเป็นสมาชิก ก็ทำการลงทะเบียนให้เรียบร้อยและ download ลงมา ซึ่งการ download สามารถเลือกแบบมาพร้อม virtual box หรือเอาแค่ GenyMotion

เมื่อ download และทำการ setup เสร็จเรียบร้อยแล้ว ก็จะขึ้นหน้ารายการอุปกรณ์ที่เรามี

genymotion_devices

สามารถเพิ่มอุปกรณ์ได้ โดยจะมี predefined เตรียมไว้ให้แล้ว และสามารถแก้ไขขนาดหน้าจอ และความละเอียดหน้าจอได้ในภายหลัง

genymotion_choose

เมื่อสร้างอุปกรณ์เรียบร้อย ก็ทำการ run จากนั้น emulator จะโผล่ขึ้นมาอย่างรวดเร็ว

genymotion_avd

จากการทดสอบตัว emulator สามารถทำงานได้รวดเร็วอยู่ในระดับน่าพอใจมาก เมื่อเทียบกับตัว native อาการหน่วงไม่ค่อยมี ซึ่งน่าจะมาจากการที่มันรันอยู่บน Virtual Box ทำให้สามารถทำงานได้เต็มประสิทธิภาพมากกว่า

นอกจากความเร็วแล้ว GenyMotion ยังมี feature ที่ใช้ในการทดสอบ app อย่างเช่นการกำหนดตำแหน่ง GPS, การจำลองแบตหมด, การใช้งานกล้องที่เสถียรกว่าของ native

นอกจาก feature ที่ว่ามานี้ ยังมี feature เทพอื่นๆอีกมาก เช่น Pixel Perfect ที่จะทำการปรับหน้าจอ emulator ให้เข้ากับหน้าจอคอม ให้เหมือนเป็นขนาดอุปกรณ์จริงๆ และยังมี API ที่ใช้ทำ automated test ได้ แต่น่าเสียดาย feature เหล่านี้ต้องเสียเงินในระดับที่สูงเกินกว่า freelance ยาจกอย่างผมจะจ่ายได้ TT^TT โดยราคา ณ วันนี้ จะตามนี้ครับ

genymotion_price

ก็ขอจบแต่เพียงเท่านี้ ขอให้ทุกท่านมีความสุข สนุกกับการพัฒนา app บน Android ครับ

頑張って!!!!!


Warning: in_array() expects parameter 2 to be array, string given in /home/content/31/10462331/html/babedev/blog/wp-content/plugins/facebook-button-plugin/facebook-button-plugin.php on line 380

Warning: in_array() expects parameter 2 to be array, string given in /home/content/31/10462331/html/babedev/blog/wp-content/plugins/facebook-button-plugin/facebook-button-plugin.php on line 383

เริ่มบทความแรก เกี่ยวกับ programming ก่อนเลย เมื่ออาทิตย์ก่อนได้รับข่าวสารจาก androidweekly.net เกี่ยวกับ library ที่ชื่อ Otto

Otto เป็น library ที่ใช้เป็นสื่อกลางในการส่งข้อมูลระหว่าง activity, fragment หรือแม้แต่ background service โดยใช้แนวคิดของ Bus ในการส่งข้อมูล แบบเดียวกับ motherboard บนเครื่องคอมพิวเตอร์ คือเมื่อมีส่วนใดส่วนหนึ่งของระบบปล่อยข้อมูลออกมา มันก็จะวิ่งไปทั่วระบบ

ซึ่งแนวคิดนี้ใน Android development ยังไม่มี (หรืออาจจะมีแต่ผมไม่รู้ -_-“) การจะทำให้ใกล้เคียงสุดคือการสร้าง global variable ใน Application หรือใน Activity ในกรณีที่ใช้ fragment และถ้าต้องการให้มีทำงานแบบ real time คือเมื่อมีการ trigger ส่งข้อมูล แล้วปลายทางต้องได้รับทันที ก็คงต้องสร้าง listener ไว้เพื่อรอรับ และต้องมีการ register อีกยาวเหยียด
พอถึงจุดๆนี้ แค่นึกภาพก็เครียดแล้ว กว่าจะเขียนเสร็จแถม code คงยุบยั่บไปหมด

และนี้คือที่มาของ Otto ที่ใช้ในการแก้ไขปัญหานี้

ถ้างั้นมาเริ่มเลยดีกว่า
ในบทความนี้ผมใช้ Otto version 1.3.5 สามารถ download ได้จาก ที่นี้

ใน application ตัวอย่างนี้ผมจะมี Activity ที่มี fragment ภายใน 1 อัน และมีปุ่มใน activity เพื่อใช้ในการส่งข้อมูลให้ fragment

เริ่มแรกด้วยการสร้าง Bus แบบ Singleton ก่อน

ใน MainActivity ทำการ register ตัว BusProvider

ผมสร้างตัว producer ไว้ใน Activity ซึ่งจะใช้ @Produce เพื่อประกาศว่า method นี้จะใช้ในการ produce ข้อมูล หลังจากนั้นสร้าง POJO ชื่อ ProduceEvent ที่มี field ชื่อ name, value ข้างใน และเมื่อกดปุ่มแล้วจะทำการเรียก .post(produce())

เมื่อ Producer เสร็จแล้ว ก็ต่อด้วย Subscriber ต่อ โดยจะสร้างไว้ใน fragment ซึ่งจะต้องทำการ register Bus แบบเดียวกับ Activity

เมื่อเสร็จแล้ว ก็ใช้ @Subscribe เพื่อประกาศว่า method นี้จะใช้เพื่อรับข้อมูล ถ้ามีการส่ง POJO ที่มี Class เดียวกันมา การจะประกาศเป็น subscriber ได้ต้องเป็น public และมี argument เดียวเท่านั้น

ผลที่ได้ก็จะเป็นตามรูป เมื่อมีการกดปุ่ม Bus จะทำการ produce ข้อมูลส่งไปให้ subscriber ต่างๆ เมื่อ subscriber ได้รับข้อมูลซึ่งมี POJO ที่ถูกต้อง ก็จะนำข้อมูลไปใช้

device-2014-08-10-204224   device-2014-08-10-204233

จากการลองใช้ library นี้ ก็น่าจะเหมาะกับการใช้รับข้อมูลที่มีการอัพเดทตลอดเวลา เช่น ข้อมูล GPS หรือถ้า project มีการใช้ fragment เยอะๆ ก็เหมาะเลย

ก็จบแต่เพียงเท่านี้ รอบหน้าถ้ามีโอกาส จะมาเขียนตัวอย่างการรับข้อมูลจากส่วนอื่นๆ อย่าง service และ thread ครับ

ありがとうございます