這是 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 上的說明,採用以下的方式可修正此問題:
使用 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