06 กุมภาพันธ์ 2556

[Android Dev Tips] ว่าด้วยเรื่อง Drawable, Assets และ External Storage


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

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

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

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


Drawable
(จริงๆคือ โฟลเดอร์ res)

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



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


Assets

Assets เหมาะสำหรับไฟล์ต่างๆที่ไม่ต้องการจัดการอะไรมากนัก 
จะแยกโฟลเดอร์เก็บแบ่งเป็นสัดส่วนก็ได้หรือจะเก็บรวมๆกันก็ได้
โดยที่ไฟล์นี้ไม่ต้องการแยกตามคุณสมบัติไฟล์อย่าง Drawable
ก็คือเป็นไฟล์ดิบๆไฟล์เดียวเลย เวลาเรียกใช้ก็เรียกไฟล์นี้ตลอด



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


External Storage

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



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

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



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

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

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

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

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




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



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

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

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

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

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

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



ไม่มีไฟล์ตัวอย่างนะ
เพราะพูดถึงทฤษฎีเท่านั้น




เหล่าพันธมิตรแอนดรอยด์

Devahoy Layer Net NuuNeoI The Cheese Factory Somkiat CC Mart Routine Artit-K Arnondora Kamonway Try to be android developer Oatrice Benz Nest Studios Kotchaphan@Medium Jirawatee@Medium Travispea@Medium