2011-06-03 84 views
1

我目前正在開發一個Android應用程序,我需要在線程內執行一個方法。我有下面的代碼,以創建線程並執行Android的線程問題

new Thread(new Runnable() { 
     @Override 
     public void run() { 
      new DownloadSync(getApplicationContext()); 
     } 
}).start(); 

當我嘗試運行此代碼,它會顯示在日誌貓「了java.lang.RuntimeException錯誤消息:無法創建內部處理線程沒有調用Looper.Prepare()。'

我該如何解決這個問題。任何幫助將不勝感激。謝謝

回答

3

使用AsyncTask。你的情況是它存在的原因。另外,請閱讀Painless Threading(主要使用AsyncTask)。

與您的代碼有關的問題是,有人試圖在您的新主題中內部使用Handler,但沒有任何內容告訴Looper準備。

+0

我想打環器將由活動本身創建,但第e線程正在過早運行。它也是從那個線程處理UI,而不是UI,但這是一個不同的故事。 – chemical 2011-06-03 21:21:50

0

我有一個較早的答案,這不是非常有幫助 - 我已經刪除,並保存相關位:

確保您DownLoadSync對象只通過一個處理程序的主UI線程通信(如果你想避免使用的AsyncTask) 聲明一個可運行和處理程序,如下所示:

final Runnable updateMainUIThread = new Runnable() { 
     public void run() { 
      Toast.makeText(getBaseContext(), "Communicating with the main thread!!", Toast.LENGTH_LONG).show(); 
     } 
    }; 


private final Handler handler = new Handler();` 

而且使用它是這樣的: handler.post(updateMainUIThread);

+1

您對與聲明相同的一段代碼的評論沒有任何意義。該聲明產生一個編譯的匿名類。在由new返回的臨時引用上調用start()完全可以。 – chemical 2011-06-03 21:17:45

+0

的確如此,但這太可怕了。真正的答案在最後一行。事實上,我開始完全避開內部班,因爲他們看起來像狗早餐(並且很難遵循) – 2011-06-03 21:30:29