ProgressBar在达到100%后会等待片刻吗?

时间:2017-12-30 16:21:16

标签: android firebase progressdialog

我第一次接触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);
                    }
                });

问题:

  1. 正如您所看到的,我在onSucess方法中将ProgressBar重置为0,这使得ProgressBar永远不会在视觉上达到100%。这是正确的方法还是应该延迟重置,以便用户暂时看到100%?我没有找到最佳做法。

  2. 只要上传正在运行,我应该禁用上传按钮吗?

  3. 编辑:

    这是否足以延迟进度条?

    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);
                        }
                    })
    

2 个答案:

答案 0 :(得分:2)

用户界面越好用户界面越好,他对应用程序质量的评价就越高。

  1. 我认为你应该这样做。在隐藏它们之前,我总是让条形显示100%约300毫秒(动画:300毫秒动画持续时间)。我认为它比直接隐藏它们更加用户友好。

  2. 您应该在上传时更好地停用上传按钮(更好),或者在点击上传时告诉用户上传正在进行。

答案 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延迟,这会隐藏你的进度条。