ExceptionInInitializerError при использовании AsyncTask - PullRequest
1 голос
/ 29 марта 2012

Я использую 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): на 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-2920: 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;
            }

        }

Ответы [ 2 ]

13 голосов
/ 29 марта 2012
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:

Экземпляр задачи должен быть создан в потоке пользовательского интерфейса.

ВВаша бочка, экземпляр задачи не создается в главном потоке приложения (он же, пользовательский интерфейс), что и приводит к этому исключению.

2 голосов
/ 29 марта 2012

Просто оберните каждый вызов com.google.app.BouncingBall.HighScore.loadFromFile или создание AsyncTask внутри него в Runnable и отправьте его в обработчик, связанный с потоком пользовательского интерфейса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...