Android系统。如何在执行一次runnable后停止处理程序

时间:2015-01-10 00:16:18

标签: android android-handler

编辑:代码现在有效。我最终从createDialog()...

中调用了loadingIllusionLoader()

我试图在用户按下按钮后显示“假”进度条。我希望进度条出现一段随机时间~2000ms然后出现一个对话框以及隐藏进度条(因为它'已加载')。

我被告知尝试使用处理程序,因为Thread.sleep锁定了UI,我不想这么做。但是,一旦我执行下面的代码,它就会运行处理程序的postDelayed函数,并且每时每刻都会出现一个新的对话框... handeler一遍又一遍地执行自己。如何停止处理程序。处理程序上的removeCallbacksAndMessages函数是一个选项,但我不确定如何完全停止打开对话框。

public void loadingIllusionLoader()
{
    ProgressBar theCircleLoader = (ProgressBar) findViewById(R.id.progressBar2);
    theCircleLoader.setVisibility(View.VISIBLE);
    int timeToRest = (int) (Math.random() * 1000) + 1500;

   final Handler newHandle = new Handler();
    newHandle.postDelayed(new Runnable() {
        @Override
        public void run() {
            createDialog();
            hidingIllusionLoader();
            newHandle.removeCallbacksAndMessages(null);

        }
    }, timeToRest);
}

public void hidingIllusionLoader()
{
    ProgressBar theCircleLoader = (ProgressBar) findViewById(R.id.progressBar2);
    theCircleLoader.setVisibility(View.INVISIBLE);
}

1 个答案:

答案 0 :(得分:1)

我认为您更愿意使用CountDownTimer

CountDownTimer timer = new CountDownTimer( 10000, 1000 ) { 
  @Override public void onTick( long millisUntilFinished ) {
    theCircleLoader.setProgress( theCircleLoader.getProgress() - 1 );
  }
  @Override public void onFinish() {
    theCircleLoader.setVisibility(View.INVISIBLE);
  }
};
编辑:几乎忘记了:

timer.start();

EDIT2:

查看代码后,我建议你修改它:

    Random rnd = new Random();
    int progressBarMax = rnd.nextInt( 10 ) + 1; // 10 - change it the way you like
    int timeToRest = progressBarMax * 500;
    theBarLoader.setMax( progressBarMax );
    theBarLoader.setProgress( 0 );

    CountDownTimer theTimer = new CountDownTimer(timeToRest, 500)

    {
        @Override public void onTick( long millisUntilFinished ) {
             theBarLoader.setProgress( theCircleLoader.getProgress() + 1 );
        }
        @Override public void onFinish() {
            theCircleLoader.setVisibility(View.INVISIBLE);
           // theBarLoader.setVisibility(View.INVISIBLE);
            createDialog();
        }
    };
    theTimer.start();