2012-03-29 40 views
1

我正在使用AsyncTask從文件中讀取數據。我運行應用程序時遇到上述錯誤。使用AsyncTask時ExceptionInInitializerError

錯誤消息是:

03-29 20:06:08.445:E/AndroidRuntime(13191): java.lang.ExceptionInInitializerError 03-29 20:06:08.445: E/AndroidRuntime (13191): 在 com.google.app.BouncingBall.HighScore.loadFromFile(HighScore.java:81) 03-29 20:06:08.445:E/AndroidRuntime(13191): 在 com.google.app .BouncingBall.HighScore。(HighScore.java:24)03-29 20:06:08.445:E/AndroidRuntime(13191):在 com.google.app.BouncingBall.Bo uncingBallActivity $ BouncingBallView.init(BouncingBallActivity.java:185) 03-29 20:06:08.445:E/AndroidRuntime(13191):at com.google.app.BouncingBall.BouncingBallActivity $ BouncingBallView.run(BouncingBallActivity.java:173 ) 03-29 20:06:08.445:E/AndroidRuntime(13191):在 java.lang.Thread.run(Thread.java:1019)03-29 20:06:08.445: E/AndroidRuntime(13191) :導致:java.lang.RuntimeException:不能 在未調用Looper.prepare() 03-29 20:06:08.445:E/AndroidRuntime(13191):at android.os的線程內創建處理程序。處理程序。(Handler.java:121)

守則

private void loadFromFile() 
    { 
     new AsyncDataStorage().execute(FILENAME); 
    } 


class AsyncDataStorage extends AsyncTask<String, Integer, Boolean> { 

     protected Boolean doInBackground(String... args) { 
      try { 
       FileInputStream fis = context.openFileInput(FILENAME); 
       byte[] raw = new byte[fis.available()]; 
       String rawData=null; 
       while(fis.read()!=-1) 
       { 
        rawData = new String(raw); 
       } 
       return (processRawData(rawData)); 
      } catch (FileNotFoundException e) { 
       e.printStackTrace(); 
       return false; 
      } catch (IOException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
       return false; 
      } 

     } 
+0

只需將每個對「com.google.app.BouncingBall.HighScore.loadFromFile」的調用或在其中創建的AsyncTask封裝到Runnable中,然後將其發佈到綁定到UI線程的Handler – 2012-03-29 15:33:55

+0

即可。你能否寫下這樣的答案,以便我能接受它。 – 2012-03-29 15:43:09

+0

當然,看到我的答案!謝謝! – 2012-03-29 16:03:43

回答

2

只需將每個調用都打包到com.google.app.BouncingBall.HighScore.loadFromFile或在其中創建AsyncTask即可,並將其發佈到綁定到UI線程的Handler。

12
03-29 20:06:08.445: E/AndroidRuntime(13191): Caused by: java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare() 03-29 20:06:08.445: 

報價the documentation for AsyncTask

任務實例必須在UI線程上創建。

在你的木桶裏,任務實例沒有在主應用程序(a.k.a.,UI)線程上創建,這就是導致這個異常的原因。

+1

謝謝,先生!只是簡單易懂的解釋。 – Shrikant 2012-10-31 09:12:52

+0

只有在另一個線程中創建AsyncTask時,ExceptionInInitializerError異常是否會發生?或者它也可能發生在其他情況下?我知道這裏的日誌顯示原因是你寫的,但我有另一個ExceptionInInitializerError沒有顯示它。 – 2017-05-31 17:34:16

+0

@androiddeveloper:我不知道 - 檢查源代碼。 – CommonsWare 2017-05-31 17:38:37

相關問題