我正在尝试处理一些文件并且需要一些时间,所以我想在执行操作时使用progressBar。在我的活动中,我有一个按钮开始处理,当我按下它时,progressBar不会更新,一段时间后操作完成,我看到处理的结果(所以函数被正确调用并充当预期)。
progressBar可见,它只是不更新。我在日志中显示getProgress()
,值增加,只有实际的progressBar没有更新。
应该更新progressBar的函数:
private byte[] processFiles() throws ExecutionException, InterruptedException {
//Init things
final ArrayList<String> fileNames = getFileList();
progressBar.setVisibility(View.VISIBLE);
progressBar.setMax(fileNames.size());
progressBar.setIndeterminate(false);
for (int i = 0 ; i<fileNames.size(); i++) {
//Do stuff on files
progressBar.setProgress(i+1);
Log.d("CurrentActivity", String.valueOf(progressBar.getProgress()));
}
return bos.toByteArray();
}
在onCreate()
:
progressBar = (ProgressBar) findViewById(R.id.progressBar);
progressBar.setIndeterminate(false);
我也尝试使用线程在android developer tutorial中显示但没有成功(虽然我没有使用while循环而是for循环,但认为它应该无关紧要。)
任何人都可以帮我解决问题吗?
注意我还尝试在每次更新之前使用它,如其他一些答案所示:
progressBar.setProgress(0);
progressBar.setMax(fileNames.size());
编辑,这是我的onClickListener:
fileButton.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v) {
// Init things
try{
new Thread(new Runnable() {
public void run() {
try {
outStream = new FileOutputStream(path);
outStream.write(processFiles());
outStream.close();
runOnUiThread(new Runnable() {
@Override
public void run() {
//stuff that updates ui
}
});
} catch (ExecutionException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}).start();
}catch(Exception e){
e.printStackTrace();
}
}
});
现在progressBar工作但是使用processedFile失败了,它是我用Glide显示的图像,之前它运行良好,但现在它没有显示任何内容。
编辑2:使用runOnUiThread
进行所有UI更新,就像魅力一样,修复了我的新问题。
答案 0 :(得分:0)
您需要使用两个线程:
主线程(又名UI线程)(又名WhereYouWorkAlways线程)
查找并存储ProgressBar
,创建Handler
,然后创建新主题(见下文)
工作线程(又名新线程)
在Thread Runnable中,在每个工作步骤之后(=在每个文件操作完成之后)在更新进度条的处理程序上发布Runnable
handler.post(new Runnable() {
public void run() {
progressBar.setProgress(i);
}
})
为什么需要两个主题
主线程实际上是UI线程,这意味着每个操作都放在以下周期的“更新”步骤中:
-> Update -> (Re)Draw -> Wait ->
这意味着如果更新持续10秒,那么屏幕将在10秒后更新。 (大多数UI都是基于单线程的)
答案 1 :(得分:0)
因为在每个周期的迭代中你都有progressBar.setProgress(0);