Jollen 的 Android Leak 開發解密, #4: Don't Create Unnecessary Objects in Main Thread

jollen 發表於 May 29, 2011 11:56 PM

在 Dev Guide 裡還有另外一個重要的觀念:避免產生不必要的物件。這個觀念真的很重要,如果要讓程式的效能更好,不斷在 Main Thread 裡產生物件是 bad idea。原因是 Garbage Collection。

Android 的 Dalvik 虛擬機在初始化時,會建立 Main Thread。Main Thread 負責眾多任務,其中之一是 Garbage Collection,也就是負責做資源回收,把用不到的物件回收再利用。如果我們不斷在 Main Thread 裡產生物件,Main Thread 很可能忙著幫我們收拾垃圾,當 Main Thread 花費太多心思幫我們撿垃圾,處理其它工作的效率就會變差,例如:UI 事件處理。

所以,這告訴我們一個重要的觀念:「不要產生不必要的物件」,難怪 Dev Guide 在講「Designing for Performance」時,把這個觀念放在首位。有些 Class 在設計時,提供了多種 instantiate(實例化)方法,以 android.os.Message 為例,我們可以這樣做:

Message msg = new Message();

也可以這樣做:

Message msg = Message.obtain();

透過 Message.obtain() 做實例化,可以重用先前的 Message object:

Return a new Message instance from the global pool. Allows us to avoid allocating new objects in many cases. (--Android SDK Reference)

如果要在 Main Thread 裡以 Message 方式處理「按鍵事件」,較好的寫法就是:

	public boolean onKeyDown(int keyCode, KeyEvent event) {
		...
		mHandler.sendMessage(Message.obtain()); // 可避免產生不必要的物件
		...
	}
要避免,也不要在 Main Thread 裡產生不必要的物件。

Android Leak 開發解密系列,整理自 Jollen 過去在 Android 領域的經驗,以「Do & Don't Do」形式分享一些重要但常被略的開發觀念。轉載請全文引用,並註明出處 (Jollen's Blog, http://www.jollen.org/blog),謝謝您對數位內容著作權的支持。

讀者留言 (1)

  • 笛蕙桂 於 June 28, 2011 21:43:

    HI, Jollen
    最近在android開發APK時遇到一個問題
    請問我能否於APK裡去作一個system call呢?
    或者透過JNI弄一個 像是system("ls");
    這樣的動作
    若能指教 感激不盡 謝謝

留言功能維護中。將於近日重新開放。

連絡作者

Jollen Chen,Moko365(仕橙3G教室)講師,熱愛研究 Linux 與 Android 技術。曾為 Motorola、HTC、Foxconn、LG、OPPO、騰迅、廣達電腦、緯創、仁寶等超過 50 家企業講授課程。目前在 MokoVersity 擔任軟體工程師,撰寫 Node.js 程式,也在幾家科技廠兼任 Android Framework 研發顧問。您可透過電子郵件 <jollen (at) jollen (dot) org> 或這裡與我連絡。