使用Handler()中断For循环

时间:2018-08-28 07:37:59

标签: android for-loop handler

当1个验证返回true时,如何断开for() loop

public void printOut (){
   final Handler handler = new Handler();
   for (final int[] x = {0}; x[0] < Integer.parseInt(spinner.getSelectedItem.toString()); x[0]++) {
       handler.postDelayed(new Runnable() {
           @Override
           public void run() {

               //printer for my device
               int query = PrinterInterface.queryStatus();
               if (query == 1){
                   // return true
                   //printing goes here..
               }else{
                   // returns false
                   x[0] = Integer.parseInt(spinner.getSelectedItem.toString());
               }
           }
       },2000 * x[0]);
   }

}

这是我的代码ATM,如果query的值返回不等于1,它将继续执行else语句,并使变量x[0]Spinner上相等。但是问题是它仍然在循环。我怎样才能阻止它?谢谢!

更新

我找到了问题。如何在}, 2000 * loopVariable[0]);上打断这部分?或停止Handler()

3 个答案:

答案 0 :(得分:1)

您必须为句柄canceled的状态设置var

例如,通过您的代码。

     public void printOut (){
           final Handler handler = new Handler();
           boolean isCanceled = false
           for (final int[] x = {0}; (x[0] < Integer.parseInt(spinner.getSelectedItem.toString()) && !isCanceled); x[0]++) {
                 handler.postDelayed(new Runnable() {
                         @Override
                         public void run() {

                             //printer for my device
                             int query = PrinterInterface.queryStatus();
                             if (query == 1){
                                   isCanceled = true
                                   // return true
                                   //printing goes here..
                             }else{
                                   // returns false
                                   x[0] = Integer.parseInt(spinner.getSelectedItem.toString());
                             }
                         }
                },2000 * x[0]);
     }

而且,如果要处理结果,则需要添加回调。

但是,我不明白,为什么使用poseDelayed,在for中,您是启动所有处理程序的。

更好,如果您选中query,则在Handler之后执行逻辑

答案 1 :(得分:0)

我不知道您为什么在handler中使用for,如果您的打印代码需要进行后台处理并尝试使用AsyncTask更新UI,则其中包含doInBackgroundonProgressUpdateonPostExecute,以便您更高效地处理代码。

答案 2 :(得分:0)

我解决了!解决方案只是一个行代码-_-,我还为Runnable添加了一个变量。谢谢您对pskink的帮助。

public void printOut (){
final Handler handler = new Handler();
for (final int[] x = {0}; x[0] < Integer.parseInt(spinner.getSelectedItem.toString()); x[0]++) {
   handler.postDelayed(new Runnable() {
       @Override
       public void run() {

           //printer for my device
           int query = PrinterInterface.queryStatus();
           if (query == 1){
               // return true
               //printing goes here..
           }else{
               // returns false
               x[0] = Integer.parseInt(spinner.getSelectedItem.toString());
               handler.removeCallbacksAndMessages(null);
           }
       }
   },2000 * x[0]);

}