繁体   English   中英

通过应用程序显示ProgressDialogs的最佳实践?

[英]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;
        }
    }
}

我正在从其他类中调用这些方法以显示/关闭ProgressDialog

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

您正在寻求最佳实践。 实际上,最佳实践是不使用ProgressDialog ,因为它们会阻止用户与应用程序进行交互。

有许多不使用ProgressDialog

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

有关此主题的其他更多信息,请参见此处: Google设计指南:进度


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

我建议您使用一个非static ProgressDialogHelper您可以为每个Activity初始化,然后将处理该Dialog 还要确保处理诸如onDestroy生命周期方法


可以使用@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并添加了一些方法来隐藏和显示该类中的进度对话框。

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...
}

现在,您可以在您在项目中创建的新活动类中扩展此基础活动,并使用这些方法显示/隐藏进度对话框。

顺便说一句,只要确保您从UI线程调用show / hide方法即可。

希望这能回答您的问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM