2011-12-27 47 views
3

我已經搜索了許多類似的問題和答案,但我仍然無法理解爲什麼我的代碼拋出這個錯誤。獲取無法在未調用Looper.prepare()和代碼的Android線程中創建處理程序4

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.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); 
    } 
} 

NewsParser parse()方法分析xml並更新視圖。

我在這裏完全損失。任何幫助將不勝感激!

謝謝!

+0

你有什麼證據表明你的問題是由這段代碼產生的?如果它來自堆棧跟蹤,查看堆棧跟蹤將會告訴您確切的失敗代碼行。 – CommonsWare 2011-12-28 00:52:30

+0

感謝您的回覆!以下是我之前應該包含的堆棧跟蹤: – Luverious 2011-12-28 17:57:19

+0

請通過編輯問題將您的堆棧跟蹤放入您的問題中。我們無法讀取您明顯嘗試發表評論的堆棧跟蹤。 – CommonsWare 2011-12-28 18:15:08

回答

8

您正在創建AsyncTask實例並從後臺線程執行它。您只能從主應用程序線程創建並執行AsyncTask實例。

+0

非常感謝,@CommonsWare!它確實來自另一個線程。基本上,我的主要活動線程在另一個線程上執行許可證檢查,完成後它會獲取新聞並嘗試執行AsynTask來完成互聯網獲取。你知道爲什麼這個代碼適用於Android 4嗎?有什麼建議來解決這個問題? – Luverious 2011-12-28 19:07:00

+0

@Luverious:「你知道爲什麼這個代碼適用於Android 4嗎?」 - 大概他們增加了支持以允許從後臺線程創建和執行'AsyncTask'。 「有什麼建議來解決這個問題?」 - 合併許可證檢查新聞獲取到一個'AsyncTask'。或者,讓它們都是'AsyncTasks',並讓許可證任務從'onPostExecute()'創建/啓動新聞任務。或者以其他方式安排新聞任務從主應用程序線程開始。 – CommonsWare 2011-12-28 20:03:32

+1

請注意,這在Android 4中不起作用。如果以前在主線程中創建了AsyncTask,它似乎可以工作,因爲看起來初始化程序在主線程外部調用時會崩潰的部分保持靜態。複製是相當麻煩的,因爲你必須等待GC來清理AsyncTasks。我在Galaxy Nexus 4.0.3上遇到了這個問題,問題的根源確實是從ThreadPool中初始化一個AsyncTask。 – 2012-05-22 14:32:05

相關問題