我第一次接触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);
}
})
用户界面越好用户界面越好,他对应用程序质量的总体评价就越高。
由于你不能在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延迟,这会隐藏你的进度条。