jollen.org

Jollen 的 Blog
Jollen's email: jollen # jollen.org
more:  Jollen's Training

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),謝謝您對數位內容著作權的支持。

Tags:

純手工打造說明:技術專欄文章為 Jollen 原創,內容皆為人工撰寫,無 AI 生成。轉載請註明出處與作者,並全文引用。轉載時請在文章開頭或結尾明顯處註明「本文出處:https://www.jollen.org,已取得原作者同意並授權使用。」
訂閱電子報:不定期 Jollen's Blog 精選文章隨 Moko365 電子報寄送;請透過 Moko365 電子報訂閱(可隨時取消)。

Copyright(c) 2001–2011 www.jollen.org. All rights reserved.
Last update: 2026-07-22