在AndroidAPP中更新MainThread中的ProgressBar

时间:2015-04-24 13:05:02

标签: java android progress

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

这是我到目前为止所尝试的,但是事情和以前一样。

点击按钮启动计数器,应用程序变得无法响应(我在mainThread中计算,这样就OKAY了(这正是我想在这里完成的) (!)))并在不久之后将进度条设置为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();
        }
    }
...
}

1 个答案:

答案 0 :(得分:1)

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

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