2012-03-29 2 views
1

私はAsyncTaskを使用してファイルからデータを読み取ります。私は、アプリケーションを実行すると上記のエラーが発生します。AsyncTaskを使用している場合のExceptionInInitializerError

エラーメッセージは、次のとおり

3月29日20:06:08.445:E/AndroidRuntime(13191): java.lang.ExceptionInInitializerError 3月29日20:06:08.445: E/AndroidRuntime (13191): でcom.google.app.BouncingBall.HighScore.loadFromFile(HighScore.java:81) 3月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 で(BouncingBallActivity.java:173) 03-29 20:06:08.445:E/AndroidRuntime(13191): で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): android.osハンドラー(Handler.java:121)

コード

the documentation for AsyncTaskを引用
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

Runnableで 'com.google.app.BouncingBall.HighScore.loadFromFile'を呼び出すか、AsyncTaskを作成してUIスレッド –

+0

にバインドされたハンドラにポストするだけです。私はそれを受け入れることができるように答えとして書くようにしてください。 –

+0

確かに、私のanswer.thanksを参照してください! –

答えて

2

すべての呼び出しをcom.google.app.BouncingBall.HighScore.loadFromFileにラップするか、またはその内にAsyncTaskを作成してRunnableに入れて、UIスレッドにバインドされたハンドラに通知します。

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: 

タスクインスタンスは、UIスレッド上で作成する必要があります。

あなたのキャッシュでは、メインインスタンスのアプリケーション(a.k.a.、UI)スレッドでタスクインスタンスが作成されていないため、この例外が発生します。

+1

ありがとうございました!単なる理解しやすい説明です。 – Shrikant

+0

ExceptionInInitializerError例外は、別のスレッドでAsyncTaskを作成する場合にのみ発生しますか?それとも他の場合にも起こりますか?私はここにあなたが書いた理由を示すログを知っていますが、私はそれを表示しない別のExceptionInInitializerErrorを持っています。 –

+0

@androiddeveloper:わかりません - ソースコードを確認してください。 – CommonsWare

関連する問題