ProgressDialog.show需要1.5分钟才能返回

时间:2015-07-08 18:51:31

标签: android

我们在十月份开发了一个新版本的应用程序,当时没有注意到这个问题,所以可能没有发生。这段代码没有改变,但改变的是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开始之间似乎有很长的延迟。

2 个答案:

答案 0 :(得分:1)

几周前发生在我身上。

在某些设备上,显示Dialog静态导致很多痛苦,而在其他设备上则没有。

它与正在使用的Context直接相关。

我建议您不要使用ProgressDialog,而是创建自己的DialogFragment并使用FragmentManager来展示或隐藏它。

它为我解决了同样的问题。

答案 1 :(得分:0)

你检查了吗? Progress dialog UI Freezes/SlowProgressdialog slow to show in Android? 这很可能是一个线程问题。如:你可能在后台线程中调用show / hide。

[原帖:]用于跟踪进度对话框的静态类是糟糕的设计。不要这样做。

您不应该从(可能)不同的上下文关闭进度对话框,因为它们可能位于不同的视图层次结构中(附加到不同的Activity),并且此视图层次结构可能已经被销毁/分离。