仅在消耗大于500毫秒的时间时才显示对话框

时间:2015-02-13 20:34:37

标签: android progressdialog

我在自定义ProgressDialog中使用AsyncTask,在完成耗时的任务后,会显示并隐藏加载对话框。有时候任务可以很快完成,对话框会立即出现并消失,对用户体验来说真的很糟糕,是否有可能只在消耗时间大于特定时间段时显示对话框,例如500毫秒?

public class MyTask extends AsyncTask<Void, String, Integer> {
 private ProgressDialog dialog;
 @Override
    protected void onPreExecute() {
        dialog = ProgressDialog.show(context, "", context.getString(R.string.loading) + "...");
    }


    @Override
    public Integer doInBackground(Void... params) {
       //time consuming task is here
    }


    @Override
    protected void onPostExecute(Integer code) {
        if (dialog != null) {
            dialog.dismiss();
        }

    }
  }

任何建议都将受到赞赏。

2 个答案:

答案 0 :(得分:0)

您可以使用Handler在500毫秒后显示对话框。然后在onPostExecute中取消处理程序的runnables(如果它们还没有运行)并隐藏对话框(如果它已创建)。

以下是一个例子:

public class MyTask extends AsyncTask<Void, String, Integer> {

    private ProgressDialog dialog;
    private Handler handler;

    @Override
    protected void onPreExecute() {
        handler = new Handler();
        handler.postDelayed(new Runnable() {
            @Override
            public void run() {
                dialog = ProgressDialog.show(context, "",
                        context.getString(R.string.loading) + "...");
            }
        }, 500);
    }


    @Override
    public Integer doInBackground(Void... params) {
        //time consuming task is here
    }


    @Override
    protected void onPostExecute(Integer code) {
        // Remove all runnables from queue
        handler.removeCallbacksAndMessages(null);
        // Hide dialog if one exists
        if (dialog != null) {
            dialog.dismiss();
        }
    }
}

答案 1 :(得分:0)

如果您无法知道它将采取多长时间并且不知道平均值,我建议不要按照@ user3249477的建议推迟对话,原因如下:

让我们说你的任务可能需要0到5000毫秒,赔率是不变的。在500ms之前你的任务完成的几率是10%。你的任务在500毫秒到1000毫秒之间完成的几率也是10%。在500ms无用之后显示对话框并且它将闪烁(立即消失)的可能性与之前相同。

我的建议:了解平均时间,然后从那里开始。