私はAndroidのアプリで通信中にProgressDialogを表示する処理をしばしば実装します。
しかし個人的な感覚になりますが、表示してすぐに閉じてしまうProgressDialogがとても嫌いです。
そのような処理の場合は表示する必要がないと思います。
ダイアログの表示を開始したら一瞬で消えてしまうと、
なんのためのダイアログかわからないときがあります。
(ダイアログに”通信中”と書いている場合に、ユーザに通信中であることを伝えたい)
だらだらと書きましたがProgressDialogの表示開始時間と最低表示時間を操作したいということです。
例えば、処理が開始して200ミリ秒以内で終わる場合はダイアログを出さないという場合に有効です。
以上の不満からProgressDialogを継承したViewを作成しました。
public class CustomProgDiag extends ProgressDialog {
// start time
private long mStartTime;
// show at least milliseconds
private long mDuration;
// showing?
private boolean isShowing;
private Handler mHandler;
private Runnable mRunnable;
public CustomProgDiag(Context context) {
super(context);
}
/**
* ミリ単位ダイアログを表示する最低時間を指定
*
* @param duration
*/
public void show(long duration) {
show(duration, 0);
}
/**
* @param duration 最低何秒間表示するか
* @param start 何秒後からダイアログ表示
*/
public void show(long duration, long start) {
mDuration = duration;
isShowing = false;
if (start == 0) {
showDiag();
return;
}
mHandler = new Handler();
mRunnable = new Runnable() {
@Override
public void run() {
showDiag();
}
};
mHandler.postDelayed(mRunnable, start);
}
public void dismiss(final Callback callback) {
if (!isShowing) {
isShowing = false;
mHandler.removeCallbacks(mRunnable);
callback.callback();
return;
}
long endTime = System.currentTimeMillis();
long diffTime = endTime - mStartTime;
if (diffTime < mDuration) {
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
CustomProgDiag.super.dismiss();
callback.callback();
}
}, mDuration - diffTime);
} else {
super.dismiss();
callback.callback();
}
}
/**
* ダイアログ表示
*/
private void showDiag() {
isShowing = true;
mStartTime = System.currentTimeMillis();
show();
}
public interface Callback {
void callback();
}
}
使用するときは
CustomProgDiag diag = new CustomProgDiag(getConstext());
diag.setMessage("通信中");
diag.show(1000,250);
上の例では
250ミリ秒後からダイアログを表示、表示した場合は最低1000ミリ秒間はダイアログを表示する
という事になります。
CustomProgDiag diag = new CustomProgDiag(getConstext());
diag.setMessage("通信中");
diag.show(1000);
第一引数のみ指定すると最低1000ミリ秒間表示するという処理になります。
閉じるときは
diag.dismiss(new CustomProgDiag.Callback() {
@Override
public void callback() {
/* ダイアログが閉じられたあとに呼ばれる */
}
となります。
以上の処理を参考にすると様々なところで活かせると思います。