【问题标题】:Best practice to show ProgressDialogs through an application?通过应用程序显示进度对话框的最佳实践?
【发布时间】:2015-05-09 10:43:03
【问题描述】:

在我的应用程序中,我想在某些事件上显示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

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

【问题讨论】:

    标签: java android progressdialog


    【解决方案1】:

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

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

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

    有关此主题的其他阅读内容,请参见此处:Google Design Guidelines: Progress


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

    我会推荐一个非 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();
        }
    }
    

    【讨论】:

    • 你能举例说明如何使用你的类
    • @MinaFawzy 创建一个新的助手实例,然后你只需使用 create, show, hide, onDestroy
    【解决方案2】:

    正如@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 线程调用显示/隐藏方法即可。

    希望这能回答你的问题。

    【讨论】:

      猜你喜欢
      • 2023-03-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-01
      • 2016-05-03
      • 1970-01-01
      • 2013-03-26
      • 1970-01-01
      相关资源
      最近更新 更多