2016-09-25 260 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

好吧,对不起,我不能有任何帮助。没有人回答,所以我给了它一个镜头。祝你好运!如果你想让我删除我的答案,因为它没用,只需说出口。 –