2016-05-16 74 views
1

我目前正在实现我自己的自定义进度对话框,我调用显示和隐藏一旦结果进来/错误发生。但是,我想实现一个自定义方法,说明如果进度对话框在10秒后没有隐藏,无论如何隐藏它并放置警报。如何在一段时间后(android)隐藏自定义加载图标?

这是我的自定义进度对话框与我的方法,但不完全工作。

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(); 
    } 
} 

这是我如何实现它的活动/片段:

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(); 
    } 

可能出现的问题: - 不是肯定,如果内存泄漏问题,因为我没有破坏它

确定的问题: - 如果进度对话框隐藏警报仍然弹出一个如果我切换屏幕不知道取消是否足以破坏计时器

回答

2

您可以使用Handler#postDelayed在稍后的某个给定线程上发生某些事情,而且您可以使用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#setOnShowListenerDialog#setOnDismissListener来拒绝任何Dialog