Получение Невозможно создать обработчик внутри потока, который не вызвал Looper.prepare () с кодом, который работал для Android 4 - PullRequest
3 голосов
/ 28 декабря 2011

Я искал много похожих вопросов и ответов здесь, но я все еще не могу понять, почему мой код выдает эту ошибку.

12-27 12:57:57.908: W/dalvikvm(465): Exception Ljava/lang/RuntimeException; thrown while initializing Landroid/os/AsyncTask;
12-27 12:57:57.908: W/dalvikvm(465): threadid=9: thread exiting with uncaught exception (group=0x40014760)
12-27 12:57:57.927: E/AndroidRuntime(465): FATAL EXCEPTION: Thread-10
12-27 12:57:57.927: E/AndroidRuntime(465): java.lang.ExceptionInInitializerError
12-27 12:57:57.927: E/AndroidRuntime(465):  at com.verious.baseballnews.NewsParser.fetchNews(NewsParser.java:137)
12-27 12:57:57.927: E/AndroidRuntime(465):  at com.verious.baseballnews.MLBNews.getLeagueNews(MLBNews.java:145)
12-27 12:57:57.927: E/AndroidRuntime(465):  at com.verious.baseballnewsreader.BaseballNewsReader.licenseCheckCompleted(BaseballNewsReader.java:45)
12-27 12:57:57.927: E/AndroidRuntime(465):  at com.verious.lm.LicenseMgr.respondFromCache(LicenseMgr.java:218)
12-27 12:57:57.927: E/AndroidRuntime(465):  at com.verious.lm.LicenseMgr.run(LicenseMgr.java:139)
12-27 12:57:57.927: E/AndroidRuntime(465):  at java.lang.Thread.run(Thread.java:1020)
12-27 12:57:57.927: E/AndroidRuntime(465): Caused by: java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
12-27 12:57:57.927: E/AndroidRuntime(465):  at android.os.Handler.<init>(Handler.java:121)
12-27 12:57:57.927: E/AndroidRuntime(465):  at android.os.AsyncTask$InternalHandler.<init>(AsyncTask.java:595)
12-27 12:57:57.927: E/AndroidRuntime(465):  at android.os.AsyncTask$InternalHandler.<init>(AsyncTask.java:595)
12-27 12:57:57.927: E/AndroidRuntime(465):  at android.os.AsyncTask.<clinit>(AsyncTask.java:184)
12-27 12:57:57.927: E/AndroidRuntime(465):  ... 6 more

У меня есть две загадки:

  1. Мой код работает с Android 4.0, но получил «Не удается создать обработчик внутри потока, который не вызвал Looper.подготовить «ошибка для всех более низких версий.
  2. Даже когда я очистил вызов doInBackground (), чтобы он возвращал только« », я все еще получил ошибку.получить некоторые новости из веб-службы с помощью AsyncTask и показать их в представлении.Вот мой основной код:
    public class News {
    
        ...
        new FetchXML().execute(url);
        ...
    
        private class FetchXML extends AsyncTask<String,String,String> {
        protected String doInBackground(final String... urls) {
    
            String urlToOpen = urls[0];
    
            URL url;
            String inputLine = null;
            String response = "";
            URLConnection connection;
    
            try {
                String authStringEnc = b64encode("user:pass".getBytes());
                            url = new URL(urlToOpen);
                connection = url.openConnection();
                connection.setRequestProperty("Authorization", "Basic " + authStringEnc);
    
                BufferedReader in = new BufferedReader(
                    new InputStreamReader(
                    connection.getInputStream()));
    
                while ((inputLine = in.readLine()) != null) { 
                    response += inputLine;
                }
                in.close();
            } catch(MalformedURLException e) {
                //
            } catch(IOException e) {
                //
            }
    
            return response;
        }
    
        protected void onPostExecute(String result) {
            super.onPostExecute(result);
            NewsParser.this.parse(result);
        }
    }
    

    Метод parse () NewsParser анализирует xml и обновляет представление.

    Я в полной потере здесь.Любая помощь будет принята с благодарностью!

    Спасибо!

1 Ответ

8 голосов
/ 28 декабря 2011

Вы создаете экземпляр AsyncTask и выполняете его из фонового потока. Вы можете создавать и выполнять экземпляр AsyncTask только из основного потока приложения.

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