为什么在Android ProgressBar上setVisibility无法正常工作?

13

如果进度条能够在不需要时消失,那就更好了。在applyMenuChoice中使用setVisibility.progressBar是否有问题?在PrintStatusTask().execute()中使用setVisibility.progressBar的问题是它会在运行时导致应用程序崩溃。

public class Controller extends Activity {
    private ProgressBar progressBar;
    ...

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.controller);
        progressBar = (ProgressBar)findViewById(R.id.progressBar);
        ...

    private boolean applyMenuChoice(MenuItem item) {
        switch (item.getItemId()) {
        case R.id.menuStatus:
            progressBar.setVisibility(View.VISIBLE);
            new PrintStatusTask().execute();
            progressBar.setVisibility(View.GONE);
            ...
2个回答

21
progressBar.setVisibility(View.VISIBLE);
new PrintStatusTask().execute();
progressBar.setVisibility(View.GONE);

这是你正在做的事情: 1. 显示进度条 2. 在单独的线程上生成任务 3. 隐藏进度条

整个过程不会超过几毫秒。你需要在PrintStatusTask类的onPostExecute()方法中隐藏进度条。

你需要明白AsyncTaskexecute()方法是调用另一个线程并且不等待它完成。这就是AsyncTask的全部意义。


明白了。谢谢。就是这样。我还需要在onPreExecute()中加上setVisibility(View.VISIBLE)。呃! - jacknad
progressBar.setVisibility(View.GONE); 是移除 progressBar 的最佳方式吗?我希望在这种情况下动画停止并且不会影响性能... - OneWorld

4

您是否想在AsyncTask中隐藏ProgressBar?如果是的话,必须在onPreExecuteonPostExecute中完成(就像所有UI命令一样)。

此外,请使用以下代码:

private void toggleProgressBar() {
    switch (progressBar.getVisibility()) {
    case View.GONE:
        progressBar.setVisibility(View.VISIBLE);
        break;
    default:
        progressBar.setVisibility(View.GONE);
        break;
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接