获取无法在未使用适用于Android 4的代码调用Looper.prepare()的线程内创建处理程序

Luv*_*ous 3 multithreading android android-asynctask

我在这里搜索了许多类似的问题和答案,但我仍然无法理解为什么我的代码会抛出这个错误.

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
Run Code Online (Sandbox Code Playgroud)

我在这里有两个谜题:

  1. 我的代码适用于Android 4.0,但是所有较低版本的"无法在未调用Looper.prepare的线程内创建处理程序"错误.
  2. 即使我清空doInBackground()调用所以它只返回一个"",我仍然得到错误.

我试图从使用AsyncTask的Web服务获取一些新闻项并在视图上显示它们.这是我的基本代码:

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

NewsParser parse()方法解析xml并更新视图.

我在这里完全失败了.任何帮助将不胜感激!

谢谢!

Com*_*are 8

您正在创建AsyncTask实例并从后台线程执行它.您只能AsyncTask从主应用程序线程创建和执行实例.