Code

Code

วันพุธที่ 16 พฤศจิกายน พ.ศ. 2559

ANDROID : App Launch time (Android Performance Patterns)


สวัสดีครับทุกท่าน จากคราวที่แล้วที่ผมแนะนำเรื่อง Best Practices for Performance : Use Enhanced For Loop Syntax (การใช้ for loop ขั้นเทพเพื่อประสิทธิภาพที่ดีและเร็วขึ้น) มาคราวนี้ผมก็มาในหัวข้อ Performance อีกแล้ว แต่เป็นเรื่องของ App Launch time 

App Launch time คืออะไร มันก็คือเวลาที่เราใช้ในการเรียกใช้งานแอพพลิเคชั่นหรือเรียกง่ายๆว่าเวลาเปิดแอพนั้นแหละครับ เอ๊ะ !! แล้วทำไมเวลาเปิดแอพถึงสำคัญถึงขนาดที่ควรจะทำตาม Performance Pattern ละ 








คุณรู้ไหมว่าทุกๆ 1/4 วินาทีของ user ที่ใช้เวลาไปกับการรอหน้าจอเปล่าๆ (ขาวๆหรือดำๆแล้วแต่ธีม) แทนที่เขาจะได้ใช้งานเลย นั้นมีโอกาศทำให้ user ปิดแอพของคุณแล้วไปให้ความสนใจกับสิ่งอื่นแทน



เห้ย หลายคนอาจจะคิดว่า แค่ 1/4 วินาที ตดยังไม่ทันหายเหม็นเลย user จะไปทำอะไรอย่างอื่นได้ไง ก็เพราะแอพส่วนใหญ่แล้วไม่ได้ใช้เวลาในการเปิดแค่ 1/4 วินาทีนะสิ 


งั้นเรามาดูการทำงานของแอพตั้งแต่แตะไอคอนเปิดไปจนถึงหน้าจอแสดงผลของแอพ 



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



จุดสำคัญคือเราปล่อยให้ user ใช้เวลากับหน้าจอเปล่าๆนานเกินไป ทำให้เขามีโอกาศที่จะเบื่อแล้วไปทำอย่างอื่น (บางคนบ้านรวยอาจจะบินโทรศัพท์ทิ้งไปเลย ฮ่าๆ)




แล้วบางแอพเลวร้ายถึงขนาดใช้เวลานานเกินไปจนแอพไม่ตอบสนอง



         สิ่งที่ควรจะดูคือ กระบวนการทำงานทั้งหมดเพื่อสร้าง activity class  ไม่ว่าจะเป็นการ inflate layout ต่างๆ หรือการโหลด resource ไปพร้อมๆกัน และจะยิ่งแย่กว่านั้นหากมี layout ซับซ้อนหรือมี logic (if,else,for, thread ,บลาๆๆ )  ซึ่งมันจะทำให้แอพของคุณแสดงผลช้าขึ้นไปอีก (Class แบบ Global ก็มีผลทำให้เป็นปัญหาด้วยเหมือนกัน) 

**จริงๆแล้วมีวิธีการแก้ปัญหาเฉพาะหน้าก็คือเอาหน้า SplashScreen มาขั้นก่อนที่จะเข้าไปสู่หน้า Main Activity เพื่อให้ view และ code มันน้อย ทำให้แสดงผลใช้ระยะเวลาน้อยลง แต่มันไม่ Best ไง เพราะต่อให้เอา SplashScreen มาขั้นมันก็ยังแสดงหน้าเปล่าๆขึ้นมาอยู่ดีแม้จะแค่ 1 วินาทีหรือเสี้ยววินาทีก็เถอะ เพราะฉะนั้นเรามาทำให้มัน best กันเถอะ

ที่นี้เราจะมาดูกันว่าแอพของเรานั้นแสดงหน้าเปล่าๆกันนานแค่ไหน ใน Logcat ของ android studio จะแสดงครับว่าแอพพลิเคชั่นของเราใช้ระยะเวลาในการเริ่มต้นไปเท่าไหร่ 

ให้เปิด Logcat ขึ้นมา แล้วลองรันแอพเลย ให้สังเกตุ log “ ActivityManager: Displayed ” ใครหาไม่เจอ ตาลายก็ copy ไปใส่ในช่อง search ของ Logcat นะครับ ตรงนี้แหละจะเป็นตัวบอกเวลาที่แอพเราใช้ในการแสดงผล อ่อ อย่าลืมปรับ Filter ของ Logcat ให้เป็น No Filter ด้วยนะครับ นี้แหละคือเวลาที่ user จะเจอหน้าเปล่า (ขาวล้วนหรือดำล้วน) ยิ่งเครื่องไหนที่ Ram น้อย ก็จะใช้เวลานานไปอีก อยากลองก็สั่งรันบน emulator ให้แรมมันน้อยๆดู ฮ่าๆ รู้เรื่องเลย..

ตัวอย่าง



ที่นี้เราจะทำยังไงไม่ให้มันเป็นหน้าเปล่าๆละ หลักการก็ง่ายๆคล้ายการออกแบบ SplashScreen เลย  สมมติผมออกแบบให้  icon อยู่ตรงกลางพื้นหลังสีเขียวเป็นหน้า Launcher

เริ่มจากสร้าง layout ไว้ใน drawable ก่อน ตั้งชื่อว่า launcher ละกัน 
*** background color : holo_green_dark    ควรจะเป็นสีเดียวกับ Theme ปกติของเรานะครับ

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@android:color/holo_green_dark" />
    <item>
        <bitmap
            android:gravity="center"
            android:src="@drawable/ic_boat" />
    </item>
</layer-list>


จากนั้นเราก็มาสร้าง Style ตามนี้
<style name="AppTheme.Launcher" parent="Theme.AppCompat.NoActionBar">
        <item name="android:windowBackground">@drawable/launcher</item>
</style>


แล้วก็นำ style ไปตั้งค่าให้ theme ของ Activity ที่ใน AndroidManifest.xml ที่ intent-filter เรียกใช้งานใน activity นั้น

<activity
            android:name=".MainActivity"
            android:theme="@style/AppTheme.Launcher">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
</activity>

หลักจากนั้นก็เพิ่ม set theme เดิม เข้าไปเพื่อให้ activity กลับมาเป็น theme ปกติ

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setTheme(R.style.AppTheme);
        setContentView(R.layout.activity_main);
    }
}


รันเลยยย ที่นี้หน้าเปล่าๆก็จะหายไปแทนที่ด้วยหน้า Launcher แล้ว 




ส่วนใครที่อยากให้หน้า Launcher นานกว่านี้ก็ตามบทความพี่เอกอันนี้ไป วิธีการทำ Splash Screen ที่ถูกต้อง (แต่ไม่ใช่ที่สุด) แต่เราก็ต้อง set theme launcher ให้กับหน้า SplashScreen ด้วยนะ 
(สมมติ launch time : 1s + SplashScreen 3s ก็จะเป็น 4s **แต่ launch time มักจะไม่คงที่ ขึ้นอยู่กับปัจจัยหลายๆอย่าง)

สำหรับวิธีนี้เป็นแค่การแก้ไขปัญหา App Launch time แสดงผลหน้าจอเปล่าๆ แท้จริงแล้วควรจะทำควบคู่ไปกับการปรับปรุงกระบวนการทำงานของโค้ดหน้าที่จะแสดงผลด้วยเพื่อให้ประสิทธิภาพการทำงานของแอพเพิ่มสูงขึ้น

Good luck have fun. 

( ผิดพลาดตรงไหนหรืออยากจะเพิ่มเติมแนะนำมาได้นะครับ หรือท่านใดอยากศึกษาเพิ่มเติมตามไปดูใน Ref ได้เลยนะครับ)

Reference





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

แสดงความคิดเห็น