通过应用程序显示进度对话框的最佳做法?

Best practice to show ProgressDialogs through an application?

在我的应用程序中,我想在某些事件中显示 ProgressDialog(例如在 AsyncTasks 期间)。我从不想同时显示多个 ProgressDialogs

最好和最有效的方法是什么? 我当前的代码如下所示:

public class ProgressDialogHelper {
    private static ProgressDialog progressDialog;

    public static void showProgressDialog(Context c) {
        if (progressDialog == null) {
            progressDialog = ProgressDialog.show(c, null, null);
            progressDialog.setContentView(R.layout.progress_bar);
        }
    }

    public static void dismissProgressDialog() {
        if (progressDialog != null) {
            progressDialog.dismiss();
            progressDialog = null;
        }
    }
}

我正在从其他 类 到 show/dismiss ProgressDialog.

调用这些方法

这被认为是好的做法吗?如果没有,我应该怎么做?

您要求的是最佳实践。事实上,最好的做法是不要使用 ProgressDialogs,因为它们会阻止用户与应用程序交互。

有许多不使用 ProgressDialog 的替代方法。

如果您的应用正在加载列表所需的数据,请放置 Spinner 而不是 ListView。

有关此主题的一些额外阅读,请参阅此处:Google Design Guidelines: Progress


如果您仍想使用 ProgressDialog,我强烈建议您不要使用上面发布的 class。它持有对 progressDialogstatic 引用,因此它在所有活动和生命周期之上是全局的。如果您的应用程序被重新创建或其他原因,这可能会导致一些麻烦。

我会推荐一个非 static ProgressDialogHelper 你可以为每个 Activity 初始化,然后这个将处理 Dialog。还要确保处理像 onDestroy

这样的 livecycle 方法

像@jagmohan 指出的那样拥有一个 BaseActivity 是可能的,但是如果你不想拥有自己的 BaseActivity 并且想使用一些东西作为插入。你可以创建这样的东西:

ProgressDialogHelper.java

public class ProgressDialogHelper {
    ProgressDialog mProgressDialog;

    public ProgressDialogHelper() {

    }

    public ProgressDialogHelper(Context context, String title, String message) {
        mProgressDialog = new ProgressDialog(context);
        mProgressDialog.setTitle(title);
        mProgressDialog.setMessage(message);
        mProgressDialog.show();
    }

    public ProgressDialog getProgressDialog() {
        return mProgressDialog;
    }

    public void setProgressDialog(ProgressDialog mProgressDialog) {
        //make sure the previous dialog is hidden
        hide();
        this.mProgressDialog = mProgressDialog;
    }

    public void show() {
        if (mProgressDialog != null && !mProgressDialog.isShowing()) {
            mProgressDialog.show();
        }
    }

    public void create(Context context, String title, String message) {
        if (mProgressDialog != null) {
            mProgressDialog.dismiss();
        }
        mProgressDialog = ProgressDialog.show(context, title, message);
    }

    public void hide() {
        if (mProgressDialog != null && mProgressDialog.isShowing()) {
            mProgressDialog.dismiss();
            mProgressDialog = null;
        }
    }

    public void onDestroy() {
        hide();
    }
}

正如@mikepenz 所指出的,最新的设计指南不鼓励使用 ProgressDialogs。但是,这是过去对我很有效的东西。

我曾经设置一个基础 Activity 并添加几个方法来隐藏和显示进度对话框 class。

public class BaseActivity extends ActionBarActivity {

    protected static final String TAG = BaseActivity.class.getSimpleName();
    protected ProgressDialog mProgressDialog;

    protected void showProgressDialog(String title, String message) {
        if (mProgressDialog != null) {
            mProgressDialog.dismiss();
        }
        mProgressDialog = ProgressDialog.show(this, title, message);
    }

    protected void hideProgressDialog() {
        if (mProgressDialog != null && mProgressDialog.isShowing()) {
            mProgressDialog.dismiss();
            mProgressDialog = null;
        }
    }

    @Override
    protected void onStop() {
        super.onStop();
        // hide progress dialog to prevent leaks
        hideProgressDialog();
    }

    // other stuff...
}

现在,您可以在项目中创建的新 activity class 中扩展此基础 activity,并将这些方法用于 show/hide 进度对话框。

顺便说一句,请确保从 UI 线程调用 show/hide 方法。

希望这能回答您的问题。