06 February 2013

ว่าด้วยเรื่อง Resource, Assets และ External Storage ในแอนดรอยด์

Updated on

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

        สำหรับ Resource ที่ว่านี้ เจ้าของบล็อกไม่ได้หมายถึงพวกหน่วยความจำหรือการบริหารทรัพยากรพวกการประมวลผลอะไรอย่างนี้นะ คนละอย่างกัน

        ขอให้ผู้ที่หลงเข้ามาอ่านเข้าใจก่อนว่าบทความนี้ Resource จะหมายถึงไฟล์ต่างๆที่จะนำเข้ามาใช้ในแอปพลิเคชันที่จะสร้างเท่านั้น และ Drawable ก็ไม่ใช่คลาส Drawable แต่จะรวมทั้งหมดที่อยู่ใน res
        ทีนี้ให้รู้กันก่อนว่า การเก็บ Resource ที่จะพูดถึงมีทั้งหมดสามแบบ นั่นก็คือคือ การเก็บใน Drawable , Assets และ External Storage ผู้ที่หลงเข้ามาอ่านอาจจะรู้จัก Drawable กันอยู่แล้วว่าเอาไว้เก็บไฟล์ภาพ เก็บไฟล์ Layout หรือไฟล์พวก xml แต่จริงๆแล้วก็ไม่ถูกต้องทั้งหมดนะ

        สำหรับการเก็บ Resource เหล่านี้ ให้คำนึงถึงความเหมาะสมในการเรียกใช้งาน โดยดูว่าไฟล์นั้นจะใช้สำหรับอะไรและเลือกเก็บไว้ให้เหมาะสม ก่อนอื่นมาดูก่อนเลยว่าแต่ละที่ เหมาะสมกับการเก็บ Resource แบบไหน

Resource Directory

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


        เจ้าของบล็อกบอกไว้ก่อนเลยว่า ไม่จำเป็นต้องเป็นแค่ไฟล์ภาพเท่านั้น จะเป็นไฟล์อะไรก็ได้ ที่ต้องการจำแนกคุณสมบัติตามขนาดหน้าจอ

Assets Directory

        เหมาะสำหรับไฟล์ต่างๆที่ไม่ต้องการจัดการอะไรมากนัก จะแยกโฟลเดอร์เก็บแบ่งตามประเภทหรือกลุ่มของไฟล์ก็ได้

        ซึ่งจะเหมาะมากกับหลายๆไฟล์ที่จะนำเข้ามาใช้งาน จะแยกโฟลเดอร์เก็บก็ได้หรือเก็บรวมๆกันก็ได้แล้วแต่ แต่ก็แนะนำให้แยกตามโฟลเดอร์เพื่อจะได้จัดการง่าย

External Storage

        External Storage หรือที่เรียกแบบภาษาชาวบ้านว่า "เมมนอก" ซึ่งอาจจะเป็นเมมเครื่องที่แบ่งเป็น Internal กับ External หรือจะเป็นพื้นที่ใน SD Card สำหรับเครื่องที่รองรับ เหมาะสำหรับใช้เก็บไฟล์แบบเดียวกับ Assets นั่นแหละ  แต่ Assets จะเป็นการเก็บไฟล์ไว้ใน Internal Storage  หรือที่เรียกกันว่า "เมมเครื่อง" หรือ "เมมใน" ต่างจากเมมนอก เพราะบางเครื่องจะมีเมมเครื่องน้อย ไม่พอสำหรับแอพใหญ่ๆ

ความแตกต่างระหว่าง Resource กับ Assets

        ทีนี้มาดูความแตกต่างลึกๆระหว่าง Drawable กับ Assets กันบ้าง นอกจากที่ Resource เหมาะกับไฟล์ที่ใช้กับ Layout โดยตรง และนอกจาก Assets ที่เหมาะกับเรียกใช้งานโดยเฉพาะแล้ว ทั้งสองอย่างนี้ก็มีการเรียกใช้งานก็ต่างกันด้วย โดยที่ 

        Resource เวลาเรียกไฟล์ก็จะอยู่ในรูปแบบ R.xxx.xxx เช่น R.drawable.image, R.layout.my_layout หรือ R.raw.myfile เป็นต้น ไม่มีการระบุว่าไฟล์นั้นๆนามสกุลอะไร แต่เรียกจาก ID ของไฟล์นั้นๆ ซึ่งโปรแกรมจะเป็นคนจัดการกับ ID ของไฟล์นั้นๆเอง ไม่ต้องยุ่งอะไร 


        ส่วน Assets การเรียกไฟล์ก็จะอยู่ในรูปแบบการเรียก Path ปกติเลย เช่น image/my_image.jpg, my_folder/main_bgm.mp3 เป็นต้น ซึ่งจะมีการระบุที่อยู่ของไฟล์นั้นๆและนามสกุลไฟล์ด้วย จึงสามารถใช้เก็บไฟล์ได้เกือบทั้งหมดที่จะใช้งานในโปรแกรม

        ดังนั้นการเลือกใช้งานก็ให้ดูว่าจะใช้ทำอะไรเป็นหลัก โดยเฉพาะไฟล์ภาพ ที่จะเข้าใจว่าต้องไว้ใน Resource แต่จริงๆแล้วก็ขึ้นอยู่กับว่าจะใช้ไฟล์ภาพนั้นทำอะไร

        ถ้าไฟล์ภาพนั้นจะเอามาแสดงเป็นพื้นหลังของแอปพลิเคชันก็ให้เก็บไว้ใน Resource จะแบ่งภาพตามขนาดหน้าจอด้วยก็ได้

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

        และก็ขึ้นอยู่กับคำสั่งที่ใช้ด้วยว่าดึงภาพจาก Assets หรือ Resource เพราะบางคำสั่งจะดึงได้จากเฉพาะที่เท่านั้น แต่บางคำสั่งก็เลือกได้ เช่น ImageView ที่มีทั้ง setImageResource, setImageBitmap, setImageURI หรือ setImageDrawable เป็นต้น



        สำหรับ External Storage เหมือนกับ Assets จึงไม่อธิบายเพื่อเทียบกับ Resource

ความแตกต่างระหว่าง Assets กับ External Storage

        ถึงแม้ว่า Assetes และ External Storage จะสามารถเก็บไฟล์ได้ๆก็ได้ แต่ทั้งสองก็มีความต่างกันอยู่ คือการเก็บไว้ในเมมเครื่องกับเมมนอก ทีนี้ก็จะอยู่ที่ว่า ไฟล์นั้นๆเหมาะที่จะเก็บไว้ที่ในเมมเครื่องหรือเมมนอก

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

        แต่ถ้าไฟล์นั้นๆมีขนาดใหญ่มากๆ ก็ควรทำเป็นไฟล์ให้ดาวน์โหลดแยก เพราะบางครั้งถ้าไฟล์ APK ที่มีขนาดใหญ่มากๆ เวลาที่ผู้ใช้เห็นขนาดไฟล์ใน Google Play ก็อาจจะทำให้ผู้ใช้ไม่อยากโหลดก็ได้ ซึ่งการดาวน์โหลดไฟล์แยกแบบนี้ก็ให้ไปเก็บไว้ใน External Storage ได้ ทำให้ไม่เปลืองเมมเครื่องมากนัก เพราะเอาไปเก็บไว้ใน External Storage

        และนอกเหนือไปจากไฟล์แยกตามที่ได้กล่าวในข้างต้นแล้ว ไฟล์ที่ควรเก็บไว้ใน Ext ก็จะเป็นไฟล์ที่สร้างจากตอนใช้โปรแกรม อย่างเช่นไฟล์ Config ที่สร้างขึ้นมาตอนที่ผู้ใช้กำหนดค่าบางอย่าง ไฟล์เอกสารที่ผู้ใช้พิมพ์ในแอปฯ หรือไฟล์ภาพที่ถ่ายด้วยแอปฯ เป็นต้น ซึ่งควรจะเก็บไว้ใน External Storage อยู่แล้ว และควรสร้างเป็นโฟลเดอร์เฉพาะด้วย เช่นเวลาเซฟไฟล์ภาพถ่ายก็ให้สร้างโฟลเดอร์ชื่อแอปฯ แล้วเก็บภาพในนั้น เพื่อเวลาที่ผู้ใช้มาหาภาพใน External Storage ทีหลัง สามารถรู้ได้จากชื่อโฟลเดอร์

        ในบางทีอาจจะมีไฟล์ชั่วคราวที่สร้างขึ้นมาในแอปฯ เพื่อสำรองไว้ แล้วจะลบทิ้งทีหลังเมื่อไม่ได้ใช้ ก็ควรเก็บไว้ใน External Storage เช่นกัน