我第一次接触ProgressDialog
,所以我没有经验。但是对于API 26,它已被弃用,我们应该使用ProgressBar
代替。
这是我的简单实现(上传到Firebase存储):
sR.putFile(mFilePath)
.addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
@Override
public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
mProgressBar.setProgress(0);
Toast.makeText(MainActivity.this, "Upload successful", Toast.LENGTH_SHORT).show();
Upload upload = new Upload(mEditTextFileName.getText().toString().trim(),
taskSnapshot.getDownloadUrl().toString());
String uploadId = mDatabase.push().getKey();
mDatabase.child(uploadId).setValue(upload);
}
})
.addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
Toast.makeText(MainActivity.this, e.getMessage(), Toast.LENGTH_SHORT).show();
}
})
.addOnProgressListener(new OnProgressListener<UploadTask.TaskSnapshot>() {
@Override
public void onProgress(UploadTask.TaskSnapshot taskSnapshot) {
double progress = (100.0 * taskSnapshot.getBytesTransferred()) / taskSnapshot.getTotalByteCount();
mProgressBar.setProgress((int) progress);
}
});
问题:
正如您所看到的,我在onSucess
方法中将ProgressBar重置为0,这使得ProgressBar永远不会在视觉上达到100%。这是正确的方法还是应该延迟重置,以便用户暂时看到100%
?我没有找到最佳做法。
只要上传正在运行,我应该禁用上传按钮吗?
编辑:
这是否足以延迟进度条?
sR.putFile(mImageUri)
.addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
@Override
public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
final Handler handler = new Handler();
handler.postDelayed(new Runnable() {
@Override
public void run() {
mProgressBar.setProgress(0);
}
}, 500);
Toast.makeText(MainActivity.this, "Upload successful", Toast.LENGTH_SHORT).show();
Upload upload = new Upload(mEditTextFileName.getText().toString().trim(),
taskSnapshot.getDownloadUrl().toString());
String uploadId = mDatabase.push().getKey();
mDatabase.child(uploadId).setValue(upload);
}
})
答案 0 :(得分:2)
用户界面越好用户界面越好,他对应用程序质量的评价就越高。
我认为你应该这样做。在隐藏它们之前,我总是让条形显示100%约300毫秒(动画:300毫秒动画持续时间)。我认为它比直接隐藏它们更加用户友好。
您应该在上传时更好地停用上传按钮(更好),或者在点击上传时告诉用户上传正在进行。
答案 1 :(得分:1)
由于您无法在5分钟后编辑评论或在评论中发布代码,因此这里更好地解释了我在评论中所说的内容,我无法保存...
我的意思是这样:
class AsyncController implements Runnable {
public static final long DefaultDelay = 300;
private final Handler mainThreadHandler;
private final Runnable runIfFinished;
private final long delay;
public AsyncController(Handler mainThreadHandler, Runnable runIfFinished, long delayMS) {
this.mainThreadHandler = mainThreadHandler;
this.runIfFinished = runIfFinished;
this.delay = delayMS > -1 ? delayMS : DefaultDelay;
}
public void run () {
// do async stuff
if (mainThreadHandler!=null && runIfFinished!=null) {
mainThreadHandler.postDelayed(runIfFinished, delay);
}
}
}
class YourActivity extends Activity {
(... Methods ...)
public onClick (View v) {
AsyncController ac=new AsyncController(new Handler(), new Runnable(){
public void run() {
// hide progress bar
}
}, 300);
new Thread(ac).start();
}
(... Methods ...)
}
但是,如果您使用Android的AsyncTask,这是很多您不需要输入的样板代码。考虑查找一个教程并使用它。你要做的唯一事情是创建处理程序并发布你的runnable延迟,这会隐藏你的进度条。