วันพุธที่ 24 ตุลาคม พ.ศ. 2555

3 วันมหัศจรรย์ เขียน App ซักตัวไม่ง่าย เมื่อมันไม่ง่าย

ขึ้นชื่อว่า Open Source อะไรๆมันก็น่าจะง่าย ติดปัญหาอะไร Google ไปเดี๋ยวก็เจอ เพราะยังไงเราก็คงไม่ใช่คนแรกที่เจอ หรือถ้าเป็นคนแรกที่เจอปัญหาจริงๆ เดี๋ยวก็จะมีคนอื่นเจอปัญหาแบบเดียวกับเรา แล้วเดี๋ยววิธีแก้ก็จะอยู่ใน Google เอง ไม่ยาก ที่ยากคือวิธีแก้ปัญหามันจะให้ผลลัพท์อย่างที่ต้องการหรือไม่

นอกเรื่องไปไกล เรื่องของเรื่องที่เขียนบล็อกนี้ ก็คือ ว่างจัดเลยจัด app android ซักตัว ประโยชน์ใช้งานเอาที่ใกล้ตัว กับมีคนทำเป็นแนวทางใน iOS แล้ว นั่นคือแอฟเช็คตารางเรียนของนักศึกษามหาวิทยาลัยนเรศวร เหมือนจะง่าย แต่ไม่ง่าย เนื่องจากระบบไม่ได้เปิด service อะไรไว้เลย เพราะฉะนั้นก็น่าจะเหลือวิธีเดียวคือ parseHTML มาตรงๆเลย(คือคิดออกแค่นี้)

ต่อมาเรื่องออกแบบตัว app จาก http://developer.android.com/design/index.html บอกไว้เยอะมาก ก็อิงตามในนี้แหละ จัดไปให้ครบทั้ง flow program, หน้าตา UI ฯลฯ จะว่าไปอันนี้ก็ลำบาก เพราะวิธีออกแบบ UI มันคนละแนวก็ iOS จริงๆ ก็เอาเป็นว่า UI ของใครของมัน ระบบใครระบบมัน ไม่ดันทุรังทำแบบเดียวกันหมด จบ

ทีนี้ตอนที่ค้นหาตารางเรียน ลองเขียนเป็น Java ธรรมดาดูก่อน เพราะมันเทสง่ายกว่า มาดูที่ระบบต่อ ระบบเว็บค้นหาตารางเรียนมันมีให้ใส่อยู่ 3 fields ซึ่งดูเหมือนว่าตัวเงื่อนไขที่เช็คใน SQL จะเป็น and ซะด้วย 0_o เอาละสิ นี่แปลว่าถ้าจะค้นอะไรแบบไม่คิดมาก ต้องส่ง query ไป 3 ครั้ง แล้วมาดักแกะข้อมูลเอาเฉพาะตัวที่ไม่ซ้ำกันออกมาสินะ อย่าเลย ลำบากเปล่าๆ ก็แยก input ใน app เราตามเค้าไปเลย โอ้ววววลืมไปว่าถ้าค้นหาเป็นชื่อหรือนามสกุล มันจะมีโอกาสที่ผลการค้นหาจะมีหลาย record เอาไงดีหว่า บังคับให้ใส่เฉพาะรหัสนักศึกษาอย่างเดียวดีกว่า แล้วเวอร์ชันหน้าค่อยเพิ่มให้ค้นหาจากชื่อและนามสกุลได้ด้วยละกัน ไม่งั้นจะเสียเวลามานั่งทำ parseHTML มากไป เพราะตัวเว็บนี่ก็ไม่มี div ไม่มี id ให้หาด้วยนะ ต้องจับจาก table อย่างเดียว โอยย น่าจะใส่ id รึ name รึ class มาซะหน่อยจะได้จับง่ายๆ ok ไม่เป็นไร อย่างน้อยก็ดึงข้อมูลมาได้ละ ใช้ Jsoup มาช่วยตัดเอาเฉพาะส่วนที่ต้องการได้อีกด้วย ยอดเยี่ยม

เอาละต่อไปก็แค่เอาโค๊ดจากตัวทดสอบที่เป็น Java มาใส่ Android ง่ายๆเลย แต่..... โอ้ว error อะไรหว่าไม่เคยเจอ ตอนเป็น Java มันไม่มีปัญหาอะไร พอมารันบน Android เป็นเรื่องเลย ก็ไม่เป็นไร Google ช่วยได้เสมอ แล้วก็ช่วยได้จริงๆ มันเป็นปัญหาเรื่อง UI Thread เอ่ออันนี้ลืมไปจริงๆ เพราะตอนที่ทำตัวทดสอบนี่ console ล้วนๆ ก็ไม่ยาก AsyncTask รับหน้าที่นี้ไป ตอนแสดงผลก็ไม่ยากอะไร ได้มาเป็น HTML ก็ยัดใส่ Webview ไปตรงๆเลย จะใช้ parseHTML มาตัดเลย ก็จะเก่งเกินไป เพราะพวกเล่นมีแต่ table ไม่ div ก็ไม่รู้จะไปจับมายังไง ใส่ไปตรงๆเลยจบ ยังไม่จบสิ ยังเหลืออีกกรณีคือจะดึงข้อมูลตารางเรียนมาได้ต้องมี internet แล้วถ้าไม่มีรึมีแต่ใช้ไม่ได้ เอาไงดี มันโชคดีตรงที่ AsyncTask มีมาให้ครบเลยว่าถ้า onCancel จะเอาไงดี เยี่ยม ประหยัดเวลาไปเยอะ ก็แค่ try catch ไว้ตรงที่มันดึงข้อมูล มีปัญหาก็ cancel() ไป ไม่มีก็รอด เย่

ปัญหาต่อมา(ไม่นับว่าเป็นปัญหาก็ได้) app android พอทำเป็น .apk ต้อง sign ด้วย ไม่งั้นจะไม่ยอมติดตั้ง ก็แค่สร้าง keystore มาซักตัว กะว่าใช้ยาว ก็จบเรื่องนี้ไป

ก็เป็นอันสำเร็จกับ 3 วันมหัศจรรย์  เขียน App ซักตัวไม่ง่าย เมื่อมันไม่ง่าย มีประโยชน์ใช้งานได้จริง(ถึงจะเอาไว้โชว์มากกว่าก็เหอะนะ)

ไม่มีความคิดเห็น: