2012-07-07 30 views
0

我想在創建應用程序時執行一些長操作(如複製/加載文件)。我創建了一個線程來執行此操作,該線程不會更新UI。我得到一個錯誤,說不能在不調用Looper.prepare()的情況下在線程中創建處理程序。我的代碼有什麼問題?android,在onCreate中創建線程時出錯()

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    threadFileManager = new Thread (
     new Runnable() { 
      public void run() { 
       FileManager fM = new FileManager(); 
       fM.copyFileFromAssetToStorage();     
     } 
    }); 
    threadFileManager.start(); 
} 

編輯:錯誤說謊在我的FileManager類中,當它是Activity的子類時。更改爲服務工作。

+1

我相信這個主題將幫助您: http://stackoverflow.com/questions/3875184/cant-create-handler-inside-thread-that-has-not-called-looper-prepare – Khanh 2012-07-07 03:01:21

+0

的錯誤是指創建一個Handler。我沒有看到您發佈的代碼中會創建Handler的任何內容。發佈FileManager的代碼。如果你需要在你的線程中使用Handler,那麼你將需要創建一個Looper來充當Handler的消息分派器。 – 2012-07-07 09:14:09

回答

1

Application類是做錯的地方。如果需要,可以使用ApplicationonCreate()方法啓動Service。您應該在Service中實現此後臺線程,因爲Service的用途是在後臺執行任務。 Application類應該很少使用。這是維持少量全球狀態的最後手段。

將此代碼移動到Service後,Android已經爲您調用了Looper.prepare()

編輯:

OP實際上是試圖建立一個處理程序的線程的內部時,他援引他的文件管理類的構造函數。雖然我上面的評論仍然是正確的,但它與OP的問題無關,因爲他是從屬於Activity而不是Application。

事實上,問題是他在一個尚未調用Looper.prepare()(通過new FileManager())的線程中創建一個Handler。正確的解決方法是在主線程上創建Handler,即在Activity或Service回調之一中創建Handler。

+0

如果你看問題中'onCreate()'方法的簽名,你會發現這不是'Application.onCreate()',而是'Activity.onCreate()'。當活動開始時,他正在創建線程,這非常合適。也許他應該使用服務(我不知道,沒有足夠的描述或代碼能夠說明),但是你的回答並沒有解決他的問題。 – 2012-07-07 09:10:00

+0

你們倆的提示都很有幫助。當它是Activity的子類時,該錯誤就在我的fileManager類中。更改爲服務工作。謝謝 – 2012-07-08 05:13:50

+0

@David Wasser,啊,現在很明顯。該處理程序正在FileManager類中進行創建,這發生在他的Thread中,該Thread尚未調用Looper.prepare()。好吧。 – 2012-07-08 05:54:22

0

您可以使用UI線程從Thread..like更新UI

yourActivityName.this.runOnUiThread(new Runnable() { 
    public void run() { 
     //make UI modification here 
    } 
}); 
+0

該問題明確指出線程不會更新UI。你爲什麼要告訴他如何更新UI? – 2012-07-07 09:11:06

+0

,因爲他試圖從後臺線程更新UI。所以我只是告訴他如何從後臺線程修改UI ..那麼這裏有什麼問題? – 2012-07-07 17:01:32

0

試試這個:

protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     Thread thread=new Thread(this); 
     thread.start(); 
     } 
    public void run() { 
      FileManager fM = new FileManager(); 
      fM.copyFileFromAssetToStorage(); 
      handler.sendEmptyMessage(0); 
     } 
    private Handler handler = new Handler() { 
      @Override 
      public void handleMessage(Message msg) { 

      } 
     }; 

這會要求你實現Runnable接口的Activity.Hope這將幫你。