仅在耗时大于 500 毫秒时显示对话框
Display dialog only if consuming time bigger than 500 milliseconds
我在我的自定义 AsyncTask
中使用 ProgressDialog
,加载对话框会在耗时的任务完成后显示和隐藏。有时候任务完成的很快,dialog就出现又消失,非常不利于用户体验,是否可以在耗时大于某个时间段,比如500毫秒才显示dialog?
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();
}
}
}
如有任何建议,我们将不胜感激。
您可以使用 Handler
,在 500 毫秒后显示对话框。然后在 onPostExecute
中取消处理程序的 运行nables(如果它们尚未 运行)并隐藏对话框(如果已创建)。
这是一个例子:
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();
}
}
}
如果您无法知道需要多长时间并且不知道平均时间,我建议您不要按照@user3249477 的建议延迟对话,原因如下:
假设您的任务可能需要 0 到 5000 毫秒,并且几率是恒定的。你的任务在 500 毫秒之前完成的几率是 10%。您的任务在 500 毫秒到 1000 毫秒之间完成的机会也是 10%。在 500 毫秒无用后显示对话框以及它闪烁(立即消失)的机会与以前相同。
我的建议:了解平均时间,然后从那里开始。
我在我的自定义 AsyncTask
中使用 ProgressDialog
,加载对话框会在耗时的任务完成后显示和隐藏。有时候任务完成的很快,dialog就出现又消失,非常不利于用户体验,是否可以在耗时大于某个时间段,比如500毫秒才显示dialog?
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();
}
}
}
如有任何建议,我们将不胜感激。
您可以使用 Handler
,在 500 毫秒后显示对话框。然后在 onPostExecute
中取消处理程序的 运行nables(如果它们尚未 运行)并隐藏对话框(如果已创建)。
这是一个例子:
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();
}
}
}
如果您无法知道需要多长时间并且不知道平均时间,我建议您不要按照@user3249477 的建议延迟对话,原因如下:
假设您的任务可能需要 0 到 5000 毫秒,并且几率是恒定的。你的任务在 500 毫秒之前完成的几率是 10%。您的任务在 500 毫秒到 1000 毫秒之间完成的机会也是 10%。在 500 毫秒无用后显示对话框以及它闪烁(立即消失)的机会与以前相同。
我的建议:了解平均时间,然后从那里开始。