我们在十月份开发了一个新版本的应用程序,当时没有注意到这个问题,所以可能没有发生。这段代码没有改变,但改变的是Android版本。我们甚至在运行4.4.2的设备上看到了这一点,因此它不仅仅是一个棒棒糖问题。
我有一个"静态"在整个应用程序中用于显示和关闭进度对话框的类。该类的相关方法包含在下面的代码块中。我已经针对有问题的API调用添加了一些时间,还包括几个调用的结果。 progressDialog是类上的静态字段,用于跟踪当前打开的对话框,以便关闭它。
/**
* Shows the progress dialog box, allowing for the message and title to be supplied.
* The progress dialog will be indeterminate and not cancelable.
*
* @param context The context that owns the dialog.
* @param message The message to display in the dialog.
* @param title The title for the dialog box.
*/
public static void showProgressDialog ( Context context, String message, String title ) {
closeProgressDialog();
String actualTitle = OverrideProgressDialogTitle ? DefaultProgressDialogTitle : title;
String actualMessage = OverrideProgressDialogMessage ? DefaultProgressDialogMessage : message;
Date start = new Date();
progressDialog = ProgressDialog.show( context, actualTitle, actualMessage, true, false );
Date end = new Date();
Log.v( LogTag, String.format("It took %s minutes to show the dialog.", DateUtils.millisecondsToMinutes( end.getTime() - start.getTime() ) ) );
}
/**
* Closes the progress dialog box if it is opened.
*/
public static void closeProgressDialog () {
if ( progressDialog != null && progressDialog.isShowing() ) {
try {
progressDialog.dismiss();
}
catch ( Exception e ) {
Log.e( LogTag, "Error closing dialog.", e );
}
}
progressDialog = null;
}
以下是一些时间安排:
It took 0.0013666668 minutes to show the dialog.
It took 3.8333333E-4 minutes to show the dialog.
It took 3.6666667E-4 minutes to show the dialog.
It took 1.4308 minutes to show the dialog.
结果是非常可重复的......第一次在应用程序的2个特定屏幕上显示对话框时,从调用返回到ProgressDialog.show大约需要1.5分钟,但后续调用显示来自那些对话框的对话框同样的地方几乎立即回归。在一种情况下,对话框从片段的onStart方法显示以加载数据,在另一种情况下,当单击按钮将数据提交给服务器时,将显示该对话框。
有没有人看起来这个方法调用需要很长时间才能返回,如果有,你是如何解决它的?
编辑:我实际上进一步追踪了这个问题,这是导致挂断的其他问题。 AsyncTask的onPreExecute方法完成和doInBackground开始之间似乎有很长的延迟。
答案 0 :(得分:1)
在某些设备上,显示Dialog
静态导致很多痛苦,而在其他设备上则没有。
它与正在使用的Context
直接相关。
我建议您不要使用ProgressDialog
,而是创建自己的DialogFragment
并使用FragmentManager
来展示或隐藏它。
它为我解决了同样的问题。
答案 1 :(得分:0)
[原帖:]用于跟踪进度对话框的静态类是糟糕的设计。不要这样做。
您不应该从(可能)不同的上下文关闭进度对话框,因为它们可能位于不同的视图层次结构中(附加到不同的Activity),并且此视图层次结构可能已经被销毁/分离。