Java 如何立即更新进度条?

Java 如何立即更新进度条?,java,android,Java,Android,我有一个AsycTask执行诸如在应用程序中复制或移动文件之类的操作,我经常使用publishProgress()更新对话框中的进度条 问题 代码几乎可以正常工作,但是当AsyncTask执行操作并更新进度条时(在onProgressUpdate()中调用setProgress()),它不会立即更新,直到任务完成为止。。。然而,在同一位置更新的TextView会被更新 我尝试了一个解决办法。。。在AsyncTask线程中使用sleep(1),以允许主线程执行(更新进度条:-))。这起作用了,当文

我有一个
AsycTask
执行诸如在应用程序中复制或移动文件之类的操作,我经常使用
publishProgress()
更新对话框中的进度条

问题

代码几乎可以正常工作,但是当
AsyncTask
执行操作并更新进度条时(在
onProgressUpdate()
中调用
setProgress()
),它不会立即更新,直到任务完成为止。。。然而,在同一位置更新的
TextView
会被更新

我尝试了一个解决办法。。。在
AsyncTask
线程中使用
sleep(1)
,以允许主线程执行(更新进度条:-))。这起作用了,当文件被删除时,进度条得到了更新。。。但是在执行时间上有很大的不同,如下所示

添加之前
睡眠(1)


已删除的文件总数-
3804

平均耗时-
5s
(平均3次测试)

添加后
睡眠(1)


已删除的文件总数-
3804

平均所用时间-
1m 40秒
(平均3次测试)

正如您所看到的,
睡眠(1)
导致了执行时间的巨大变化。还有别的办法吗以原子方式更新进度条 我真的非常感谢任何建议…这是代码

注意:我尝试使用另一个下载的filemanager应用程序删除相同的文件,该应用程序在删除过程中显示进度条,时间与我添加睡眠(1)(1m 40秒)的测试相对应


My
doInBackground()

@覆盖
受保护的布尔doInBackground(HashMap.simpleimutableentry…args){
mTask=args[0]。getKey();
mFiles=args[0].getValue();
//这将根据任务调用该方法
交换机(mTask){
案例任务副本:
返回副本();
案例任务(移动):
返回移动();
...
}
}

My
onProgressUpdate()
(在我更新视图的地方,当我调用
publishProgress()
时,它会被频繁调用)

@覆盖
受保护的void onProgressUpdate(对象[]值){
...
//这是我更新进度条的百分比值的地方
//实例字段
//私有原子进程,mLimit
double i=mProgress.get(),j=mLimit.get();
int k=((int)(j<1?0:(i/j)*100));
//此mTextView会立即正确更新
mTextView.setText(mTaskMsg+k+“%\t\t”+mProgress.get()+“/”+mLimit.get());
//但这个进度条会一直更新,直到任务完全完成(即100),除非我睡觉(1)
mProgressBar.setProgress(k,true);
}

从asynctask线程调用的其他方法

//实现了FileVisitor
@凌驾
公共文件VisitResult visitFile(路径路径,基本文件属性属性属性){
mProgress.incrementAndGet();
出版进度();
//这是我被迫睡眠的地方,以允许主线程中的进度更新
试一试{
Thread.sleep(1);//这并不是我所知道的最好的。。。
Files.delete(路径);}
捕获(可丢弃的t){
publishProgress(错误代码,t);}
返回FileVisitResult.CONTINUE;
}
@凌驾
公共文件VisitResult visitFileFailed(路径路径,IOException io){
mProgress.incrementAndGet();
发布进度(错误代码,io);
返回FileVisitResult.CONTINUE;
}
@凌驾
公共文件VisitResult postVisitDirectory(路径,IOException io){
mProgress.incrementAndGet();
出版进度();
试一试{
Files.delete(路径);}
捕获(可丢弃的t){
publishProgress(错误代码,t);}
返回FileVisitResult.CONTINUE;
}
...
私有布尔删除(){
出版进度();
试一试{
if(mFiles[0].isDirectory()){
Stream s=Files.walk(mFiles[0].toPath());
//我自己计算这里的文件,因为计数方法
//如果应用程序中的文件超过3000个,则流会崩溃,毫无例外……我抓到了Throwable。
//虽然这不是问题。。。
s、 forEach(这个);
出版进度();
Files.walkFileTree(mFiles[0].toPath(),此文件);
}
否则{
mLimit.incrementAndGet();
mProgress.incrementAndGet();
出版进度();
返回mFiles[0]。删除();
}
}
捕获(可丢弃的t){
publishProgress(错误代码,t);}
返回false;
}