簡體   English   中英

使用AsyncTask時發生ExceptionInInitializerError

[英]ExceptionInInitializerError when using AsyncTask

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

錯誤消息是:

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):at com.google.app.BouncingBall.HighScore。(HighScore.java:24)03-29 20:06:08.445:E / AndroidRuntime(13191):位於com.google.app.BouncingBall.BouncingBallActivity $ BouncingBallView.init(BouncingBallActivity.java:185)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):at 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。(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;
            }

        }
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: 

引用AsyncTask的文檔

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

在您的酒桶中,沒有在主應用程序(aka,UI)線程上創建任務實例,這就是導致此異常的原因。

只需將對com.google.app.BouncingBall.HighScore.loadFromFile每次調用或在其中創建的AsyncTask封裝在Runnable中,然后將其發布到綁定到UI線程的Handler中即可。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM