java - Android APP主线程内更新进度条

标签 java android progress

我有2 个按钮以及一个进度条。 现在我想从 0 到 100 计数并用计数器更新进度条。不幸的是,这个计数太快了,我看不到进度(我只能看到进度条在一“毫秒”内从 0 跳到 100。)。

这是我到目前为止所尝试过的,但是还是发生了与以前相同的情况。

单击按钮启动计数器,应用程序变得无响应(我在主线程内计算,所以没关系(这正是我想要在这里完成的任务) (!))) 并不久后将进度条设置为 100没有介于两者之间

现在,如果您能引导我走向正确的方向,我将不胜感激! :)

public class MainActivity extends ActionBarActivity {
    public String TAG = "MainActivity";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        addButtonListeners();
    }

    public void addButtonListeners() {
        Button firstButton, secondButton;
        final ProgressBar pgBar;

        firstButton = (Button) findViewById(R.id.first_button);
        secondButton = (Button) findViewById(R.id.second_button);
        pgBar = (ProgressBar) findViewById(R.id.progressBar);


        firstButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Log.d(TAG, "First Button was pressed.");
                for (int i = 0; i <= 100; i++) {
                    countProgBarUp(pgBar, i);
                }
            }
        });

        secondButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Log.d(TAG, "Second Button was pressed.");

            }
        });

    }

    public void countProgBarUp(ProgressBar pgBar, int counter) {
        try {
            Thread.sleep(100);
            pgBar.setProgress(counter);

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

最佳答案

UI 变得无响应,因为您正在主线程上执行此操作并处于 sleep 状态。如果您没有从 onClick() 返回,则主线程无法处理 UI 更改,例如显示新进度。只有主线程可以更新 UI 组件并绘制它们。因此,它通常被称为 UI 线程。

您可以尝试创建一个Runnable,它将进度条更新为新的计数。创建一个绑定(bind)到 UI 线程的 Handler,并为 Handler 调用 postDelayed() 并为其提供一个 Runnable 实例。然后,只要您尚未达到最大进度,就可以在 Runnable 中再次发布它。

关于java - Android APP主线程内更新进度条,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29848300/

相关文章:

java - 良好的 Java 属性文件编辑器

java - 从日期范围选择中选择第一个和最后一个日期

android - AsyncTask android中的setText

eclipse-plugin - Eclipse 作业 API : how to track progress for job scheduled by another job?

android - 与服务器同步时的进度条

java - 在 servlet 和 JSP 之间共享静态数据时选择什么最佳策略?

java - Spring-boot-starter-mail 3.1.1 抛出 "Not provider of jakarta.mail.util.StreamProvider was found"

Java:显示方法调用中使用的所有字符串

android - 启动显示属于对话的所有短信线程的 UI 的 Intent 是什么?

progress - 我们如何估计程序完成所需的时间并将其反射(reflect)到进度条上?