2012-12-20 22 views
0

的線程內創建處理程序我有一個方法可以從庫項目中創建和調用方法。庫方法從資源加載數據。我在工作者線程上執行此操作,並且在執行此操作時不要觸摸UI。使得呼叫(在工作線程)的方法是:無法在未調用Looper.prepare()

private void testGetXData(){ 

try { 

    Data data = new Data(); 
    String xsd = data.getXSD(); 
    importedData = xsd; 

} catch (Exception e) { 
    System.out.println(e.getMessage();); 
} 

} 

和異常情況就行了:

Data data = new Data(); 

Data是在我的庫項目的類。而importedData是模塊級別的字符串。

我並沒有直接使用處理器編輯。我所要調用的方法是:

new Thread(new Runnable() { 
    public void run() { 
     testGetXData(); 
    } 
}).start(); 

我這樣做是爲了不阻塞UI線程並獲取可怕的ANR消息。 爲了完整起見,我將資源移至圖書館與服務共享。當資源在應用程序項目中時,這工作得很好。自從我將它移至庫項目之後,它現在才拋出此異常。

此外

如果我註釋掉使用工作者線程和主線程上執行調用,它的作品!然而,我想在後臺線程上執行此操作,但仍會引發異常。

+0

Data()構造函數的代碼是什麼? – iagreen

+0

發佈堆棧跟蹤 – njzk2

回答

0

我猜消息試圖獲取當前線程的處理程序並失敗。爲了能夠在一個線程上創建處理程序,它需要一個Looper,而默認的「線程」實現沒有一個。

擴展HandlerThread而不是線程應該解決問題。

0

如果您說new Handler()沒有指定Looper它將嘗試獲取當前線程的Looper。普通工作者線程沒有活套。

Looper確定哪個線程處理Message S /執行Runnable小號

要麼做

new Handler(Looper.getMainLooper()); 

,如果你想在UI線程處理的消息或創建一個額外的線程,可處理的消息。見HandlerThread例如這裏Android ANRs from code running in a Handler?

注意,你不能有一個Looper你的工作線程內,因爲彎針通過等待新的消息來處理佔據run方法。

相關問題