Jollen 的 Android Leak 開發解密, #3: Don't Access the Android UI toolkit at Worker Threads

jollen 發表於 May 1, 2011 10:36 PM

這是 Android 官方「Dev Guide」裡提到的重要級觀念,但經常被忽略,因此在這裡做個簡單的說明。

許多 Android 應用程式經常發生「undefined」與「unexpected」的錯誤,很多錯誤的起因都是違反了這個觀念。在 Android Dev Guide 裡提到,每一個 Android process 都有一個「UI thread」負責處理 UI 事件,為了避免 ANR,應用程式開發者應該建立 Java thread 來執行像是 long operation 等的工作,由應用程式自行產生的 thread,稱為「worker thread」。Worker thread 有時也稱為 secondary thread 或 child thread。但問題發生了,一些應用程式在 woker thread 裡操作 Android UI toolkit。

所謂的 Android UI tookit 就是 android.widget 與 android.view 二個 package。以下是 Dev Guide 上的範例片斷:

public void onClick(View v) {
    new Thread(new Runnable() {
        public void run() {
            Bitmap b = loadImageFromNetwork("http://example.com/image.png");
            mImageView.setImageBitmap(b);
        }
    }).start();
}
(Source: Android Dev Guide)

範例中的 mImageView 物件就是 android.widget.ImageView。這是不對的寫法。根據 Dev Guide 上的說明,採用以下的方式可修正此問題:

  • Activity.runOnUiThread(Runnable)
  • View.post(Runnable)
  • View.postDelayed(Runnable, long)

使用 View.post() 將 'Runnable' 放到 message queue 裡即可解決此問題。Message queue 裡的 'Runnable' 會在 UI thread 上執行。

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

Jollen's Blog 使用 Github issues 與讀者交流討論。請點擊上方的文章專屬 issue,或 open a new issue

您可透過電子郵件 jollen@jollen.org,或是 Linkedin 與我連絡。更歡迎使用微信,請搜尋 WeChat ID:jollentw