如何在一定时间后隐藏自定义加载图标(android)?

时间:2016-05-16 23:17:58

标签: android progressdialog countdowntimer

我目前正在实现我自己的自定义进度对话框,一旦结果进入/错误就调用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秒后弹出,这意味着取消未被调用 - 此外,如果我切换屏幕不确定取消是否足以销毁计时器

1 个答案:

答案 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);
  }
}

然后,您可以通过将此监听器与DialogDialog#setOnShowListener相关联来使用它来自我解雇任何Dialog#setOnDismissListener