1. 程式人生 > >Android 錯誤收集

Android 錯誤收集

錯誤1

問題描述:使用AsyncTask非同步處理,更新UI元件時,直接對UI元件進行操作,報錯,異常資訊如下:

 ERROR/AndroidRuntime(641): Caused by: android.view.ViewRoot$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
錯誤分析:不能再非同步處理AsyncTask工作執行緒中更新UI

解決辦法:呼叫post方法更新UI元件

當應用程式啟動,建立了一個叫“main”的執行緒,用於管理

UI相關,又叫UI執行緒。其他執行緒叫工作執行緒(Work Thread)。

Single Thread Model

  • 一個元件的建立並不會新建一個執行緒,他們的建立都在UI執行緒中進行,包括他們的回撥方法,如onKeyDown()
  • 當在UI執行緒中進行某些耗時的操作時,將會阻塞UI執行緒,一般阻塞超過5秒就會顯示一個ANR對話方塊。
  • UI執行緒是非執行緒安全的,所以,不能在工作執行緒中操作UI元素。

    兩個原則

    • Do not block the UI thread (不要阻塞UI執行緒)
    • Do not access the Android UI toolkit from outside the UI thread (不要在工作執行緒中操作UI元素)

    在工作執行緒更新UI方法

    • Activity.runOnUiThread(Runnable)
    • Handler
      • sendMessage(Message)
      • post(Runnable)
    • AsyncTask
      • execute()
      • doInBackground()
      • onPostExecute()

 錯誤2

問題描述:android:exported屬性設定為false時,其他應用程式元件不能與之互動。報錯如下:

 E/AndroidRuntime(1182): java.lang.SecurityException: Not allowed to start service Intent { act=com.huawei.pce.action.PCE_SERVICE (has extras) } without permission private to package

錯誤分析:

解決辦法:將android:exported設定為true

這個屬性用於指示該服務是否能被其他程式應用元件呼叫或跟他互動; 取值為(true | false),如果設定成true,則能夠被呼叫或互動,否則不能;設定為false時,只有同一個應用程式的元件或帶有相同使用者ID的應用程式才能啟動或繫結該服務。