2016-09-25 256 views
0

當我爲Android編寫某種HTML下載器時,我決定使用ProgressBar,但它拋出了java.lang.IllegalStateException: The current thread must have a looper!。我知道這個異常在函數需要在主線程中調用時拋出,但我在runOnUiThread()中調用它請查看下面的代碼。ProgressBar looper異常runOnUiThread

//Inside a worker thread's run() 
progressbar.setInterminate(true); //No Exception here 
//Connect and get InputStream. 
progressbar.setMax(conn.getContentLength()); //No exception here, too 
progressbar.setProgress(0); //No exception here. 
runOnUiThread(new Runnable() { 
    @Override 
    public void run() { 
     progressbar.setInterminate(false); //Exception here! 
    } 
}); 

我已經試過移動setProgress()低於setInterminate(false)但什麼也沒做。

在此先感謝。

+0

我假設你的工作線程只運行一次下載的東西?是對的嗎? –

+0

@Inferno你是對的。也許我應該使用一個共享的值來存檔它? – minary

+0

什麼是「進步」?它來自哪裏?您似乎有兩個不同的進度條對象:'progressbar'和'progress'。請提供更多細節,並可能添加堆棧跟蹤。 –

回答

0

我對編程相當陌生,對HTML下載器等我一無所知,但我會盡力幫忙。從我讀過的內容來看,除非創建了新的線程,否則默認的主線程就是運行所有內容的地方。那麼如果你有progress.setInterminate(false);progressbar.setProgress(0);而不是在一個新的線程?

+0

那麼,正如代碼所說,'//在一個工作線程的run()'內部,上面的*代碼*在一個新的線程中。和函數'runOnUiThread(Runnable r)'在主線程*中運行r *。此外,我不得不在這裏使用新的線程,因爲Android不會讓人們從主線程訪問網絡。 (由於阻塞問題) – minary

+0

好吧,對不起,我不能有任何幫助。沒有人回答,所以我給了它一個鏡頭。祝你好運!如果你想讓我刪除我的答案,因爲它沒用,只需說出口。 –