progressBar没有使用setProgress更新

时间:2017-06-02 19:05:45

标签: android progress-bar

我正在尝试处理一些文件并且需要一些时间,所以我想在执行操作时使用progressBar。在我的活动中,我有一个按钮开始处理,当我按下它时,progressBar不会更新,一段时间后操作完成,我看到处理的结果(所以函数被正确调用并充当预期)。

progressBar可见,它只是不更新​​。我在日志中显示getProgress(),值增加,只有实际的progressBar没有更新。

应该更新progressBar的函数:

private byte[] processFiles() throws ExecutionException, InterruptedException {
        //Init things
        final ArrayList<String> fileNames = getFileList();
        progressBar.setVisibility(View.VISIBLE);
        progressBar.setMax(fileNames.size());
        progressBar.setIndeterminate(false);

        for (int i = 0 ; i<fileNames.size(); i++) {
            //Do stuff on files
            progressBar.setProgress(i+1);
            Log.d("CurrentActivity", String.valueOf(progressBar.getProgress()));
        }
        return bos.toByteArray();
    }

onCreate()

progressBar = (ProgressBar) findViewById(R.id.progressBar);
progressBar.setIndeterminate(false);

我也尝试使用线程在android developer tutorial中显示但没有成功(虽然我没有使用while循环而是for循环,但认为它应该无关紧要。)

任何人都可以帮我解决问题吗?

注意我还尝试在每次更新之前使用它,如其他一些答案所示:

progressBar.setProgress(0);
progressBar.setMax(fileNames.size());

编辑,这是我的onClickListener:

fileButton.setOnClickListener(new View.OnClickListener(){
        @Override
        public void onClick(View v) {
            // Init things
            try{
                new Thread(new Runnable() {
                    public void run() {
                        try {
                            outStream = new FileOutputStream(path);
                            outStream.write(processFiles());
                            outStream.close();

                            runOnUiThread(new Runnable() {
                                @Override
                                public void run() {
                                    //stuff that updates ui

                                }
                            });
                        } catch (ExecutionException e) {
                            e.printStackTrace();
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                }).start();

            }catch(Exception e){
                e.printStackTrace();
            }
        }
    });

现在progressBar工作但是使用processedFile失败了,它是我用Glide显示的图像,之前它运行良好,但现在它没有显示任何内容。

编辑2:使用runOnUiThread进行所有UI更新,就像魅力一样,修复了我的新问题。

2 个答案:

答案 0 :(得分:0)

您需要使用两个线程:

主线程(又名UI线程)(又名WhereYouWorkAlways线程)

查找并存储ProgressBar,创建Handler,然后创建新主题(见下文)

工作线程(又名新线程)

在Thread Runnable中,在每个工作步骤之后(=在每个文件操作完成之后)在更新进度条的处理程序上发布Runnable

handler.post(new Runnable() { 
    public void run() {
        progressBar.setProgress(i);
    }
})

为什么需要两个主题

主线程实际上是UI线程,这意味着每个操作都放在以下周期的“更新”步骤中:

-> Update -> (Re)Draw -> Wait ->

这意味着如果更新持续10秒,那么屏幕将在10秒后更新。 (大多数UI都是基于单线程的)

答案 1 :(得分:0)

因为在每个周期的迭代中你都有progressBar.setProgress(0);