使用 Handler() 打破 For 循环

Breaking For loop with Handler()

当 1 个验证 return 为真时,如何打破 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 值 return 不等于 1,它将继续执行 else 语句并使变量 x[0] 等于Spinner。但问题是它仍在循环。我怎样才能让它停止?谢谢!

更新

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

你必须为 handle canceled status

创建 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

我不知道你为什么在 for 中使用 handler,如果你的打印代码需要后台处理并更新 UI 尝试使用 AsyncTask,它有doInBackgroundonProgressUpdateonPostExecute 这样您就可以更高效地处理代码。

我修好了!解决方案只有一行代码-_-,我还为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]);

}