我在自定义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();
}
}
}
任何建议都将受到赞赏。
答案 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无用之后显示对话框并且它将闪烁(立即消失)的可能性与之前相同。
我的建议:了解平均时间,然后从那里开始。