通过应用程序显示进度对话框的最佳做法?
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
.
调用这些方法
这被认为是好的做法吗?如果没有,我应该怎么做?
您要求的是最佳实践。事实上,最好的做法是不要使用 ProgressDialog
s,因为它们会阻止用户与应用程序交互。
有许多不使用 ProgressDialog
的替代方法。
如果您的应用正在加载列表所需的数据,请放置 Spinner
而不是 ListView。
有关此主题的一些额外阅读,请参阅此处:Google Design Guidelines: Progress
如果您仍想使用 ProgressDialog
,我强烈建议您不要使用上面发布的 class。它持有对 progressDialog
的 static
引用,因此它在所有活动和生命周期之上是全局的。如果您的应用程序被重新创建或其他原因,这可能会导致一些麻烦。
我会推荐一个非 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 方法。
希望这能回答您的问题。
在我的应用程序中,我想在某些事件中显示 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
.
这被认为是好的做法吗?如果没有,我应该怎么做?
您要求的是最佳实践。事实上,最好的做法是不要使用 ProgressDialog
s,因为它们会阻止用户与应用程序交互。
有许多不使用 ProgressDialog
的替代方法。
如果您的应用正在加载列表所需的数据,请放置 Spinner
而不是 ListView。
有关此主题的一些额外阅读,请参阅此处:Google Design Guidelines: Progress
如果您仍想使用 ProgressDialog
,我强烈建议您不要使用上面发布的 class。它持有对 progressDialog
的 static
引用,因此它在所有活动和生命周期之上是全局的。如果您的应用程序被重新创建或其他原因,这可能会导致一些麻烦。
我会推荐一个非 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
并添加几个方法来隐藏和显示进度对话框 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 方法。
希望这能回答您的问题。