我目前正在实现我自己的自定义进度对话框,一旦结果进入/错误就调用show和hide。但是,我想实现一个自定义方法,该方法说明如果进度对话框在10秒后没有隐藏,无论如何,隐藏它并发出警报。
这是我的自定义进度对话框,我的方法有效但不完全。
public class CustomProgressDialog extends ProgressDialog {
private AnimationDrawable animation;
private CountDownTimer cTimer = null;
private Context mContext;
public CustomProgressDialog(Context context) {
super(context);
mContext = context;
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.custom_progress_dialog);
ImageView la = (ImageView) findViewById(R.id.animation);
la.setBackgroundResource(R.drawable.custom_progress_dialog_animation);
animation = (AnimationDrawable) la.getBackground();
}
@Override
public void show() {
super.show();
animation.start();
startTimer();
}
@Override
public void dismiss() {
super.dismiss();
animation.stop();
if(cTimer != null) {
cTimer.cancel();
}
}
//timer added just in case progress dialog does not stop on its own
private void startTimer() {
cTimer = new CountDownTimer(10000, 1000) {
public void onTick(long millisUntilFinished) {
}
public void onFinish() {
dismiss();
AlertDialogManager alert = new AlertDialogManager();
alert.showAlertDialog(mContext, mContext.getString(R.string.loadingErr), mContext.getString(R.string.loadingErrTxt), 3);
}
}.start();
}
@Override
public void onDetachedFromWindow() {
super.onDetachedFromWindow();
animation.stop();
cTimer.cancel();
}
}
这就是我在activity / fragment中实现它的方式:
private void showProgressDialog() {
customProgressDialog = new CustomProgressDialog(this);
customProgressDialog.getWindow().setBackgroundDrawable(new ColorDrawable(android.graphics.Color.TRANSPARENT));
customProgressDialog.show();
//so it cannot be closed by user first one lets back button cancel it
//customProgressDialog.setCanceledOnTouchOutside(false);
customProgressDialog.setCancelable(false);
}
private void hideProgressDialog() {
if(customProgressDialog != null) {
//customProgressDialog.hide();
}
}
UPDATE:这是我试过的第二个选项,它仍然不会停止弹出警报,这让我觉得计时器在取消时仍然会继续。
这是活动:
private void autoProgressShutdown() {
Runnable progressRunnable = new Runnable() {
@Override
public void run() {
customProgressDialog.cancel();
callAlert();
}
};
Handler pdCanceller = new Handler();
pdCanceller.postDelayed(progressRunnable, 10000);
}
private void callAlert() {
AlertDialogManager alert = new AlertDialogManager();
alert.showAlertDialog(this, getString(R.string.loadingErr), getString(R.string.loadingErrTxt), 3);
}
private void showProgressDialog() {
customProgressDialog = new CustomProgressDialog(this);
customProgressDialog.getWindow().setBackgroundDrawable(new ColorDrawable(android.graphics.Color.TRANSPARENT));
customProgressDialog.show();
//so it cannot be closed by user first one lets back button cancel it
//customProgressDialog.setCanceledOnTouchOutside(false);
customProgressDialog.setCancelable(false);
autoProgressShutdown();
}
private void hideProgressDialog() {
customProgressDialog.cancel();
if(customProgressDialog != null) {
customProgressDialog.hide();
}
}
在自定义对话框中编辑文件以删除所有计时器内容并添加:
@Override
public void setOnCancelListener(OnCancelListener listener) {
super.setOnCancelListener(listener);
dismiss();
}
可能的问题: - 不确定内存泄漏问题,因为我没有破坏它
明确问题: - 如果隐藏了“进度”对话框,则警报仍会在10秒后弹出,这意味着取消未被调用 - 此外,如果我切换屏幕不确定取消是否足以销毁计时器
答案 0 :(得分:2)
您可以使用Handler#postDelayed
稍后在给定线程上发生某些事情,并且可以使用Handler#removeCallbacksAndMessages
取消待处理任务。如果你用null
调用它,它只是取消了处理程序上的任何待处理的东西,如果你在发布的任务中有一些你需要阻止的东西。
这是你的对话,但正确地自我终止:
class SuicideDialog extends Dialog{
private Handler mAutoTerminationHandler;
@Override
public void onShow(){
mAutoTerminationHandler = new Handler();
}
@Override
public void show(){
super.show();
mAutoTerminationHandler.postDelayed(new Runnable(){
dismiss();
}, 666L);
}
@Override
public void dismiss(){
mAutoTerminationHandler.removeCallbacksAndMessages(null);
super.dismiss();
}
}
或者,您可以将生命周期监听到自己的类中:
class ShownTaskListener implements OnShowListener, OnDismissListener {
private Handler mHandler;
@Override
public ShownTaskListener(Handler handler, Runnable showTask){
mHandler = handler;
mShowTask = showTask;
}
// from OnShowListener
@Override
public void onShow(){
mHandler.postDelayed(mShowTask, 666L);
}
// from OnDismissListener
@Override
public void onDismiss(){
// get rid of all pending actions in the Handler
mHandler.removeCallbacksAndMessages(null);
}
}
然后,您可以通过将此监听器与Dialog
和Dialog#setOnShowListener
相关联来使用它来自我解雇任何Dialog#setOnDismissListener
。