Android ProgressBar是否应该在达到100%后等待片刻?

Android ProgressBar是否应该在达到100%后等待片刻?,android,firebase,progressdialog,Android,Firebase,Progressdialog,我正要第一次接触到ProgressDialog,所以我没有这方面的经验。但对于API26,它已被弃用,我们应该使用ProgressBar。 这是我的简单实现(上传到Firebase存储): 用户界面引导得越好,他对应用程序的总体质量就越好 我想你应该。我总是让条形图100%显示大约300毫秒,然后再隐藏它们(动画:300毫秒动画持续时间)。我认为它比直接隐藏它们更方便用户 您应该在上传时禁用上传按钮(更好),或者在点击时告诉用户上传正在进行 由于你不能在5分钟后编辑评论或在评论中发布代码,这里有

我正要第一次接触到
ProgressDialog
,所以我没有这方面的经验。但对于API26,它已被弃用,我们应该使用
ProgressBar
。 这是我的简单实现(上传到Firebase存储):


用户界面引导得越好,他对应用程序的总体质量就越好

  • 我想你应该。我总是让条形图100%显示大约300毫秒,然后再隐藏它们(动画:300毫秒动画持续时间)。我认为它比直接隐藏它们更方便用户

  • 您应该在上传时禁用上传按钮(更好),或者在点击时告诉用户上传正在进行


  • 由于你不能在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 delayed,这会隐藏您的进度条。

    谢谢,这非常有帮助。我真的不知道如何适当地延迟进度条。我应该使用handler.postdayed吗?是的。我通常使用处理程序来发布延迟的可运行项。最好的方法,因为可见性和动画必须在主线程上进行管理。只需确保在主线程上创建处理程序实例。哇,这看起来非常复杂。我还没有使用AsynTask或Handler的经验,但是为什么我不能使用
    Handler.postDelayed(new Runnable(){…})
    并在那里重置它呢?当你有时间的时候,你能看看我更新的问题吗?我在那里发布了我的方法。好吧,它基本上是按照你的方式工作的。您需要确保处理程序对象正在主(UI)线程上实例化。否则你可能会坠机。我只是不确定你的回调方法是在哪个线程上被触发的,你也不能(想想如果它们更新firebase框架会发生什么)。提示:尽可能使用“final”关键字(相应地配置AS检查),并查看如何修改代码。然后在代码中创建处理程序对象,确保它在UI线程上运行。如果我根本不使用延迟,可能会更好。我是初学者
    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);
                        }
                    })
    
    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 ...)
    
    }