Разорвать цикл с обработчиком () - PullRequest
0 голосов
/ 28 августа 2018

Как мне сломать for() loop, если 1 проверка вернула истину.

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. Но проблема в том, что он все еще работает. Как я могу остановить это? Спасибо!

UPDATE

Я нахожу проблему. на }, 2000 * loopVariable[0]); как я могу прервать эту часть? или остановите Handler()

Ответы [ 3 ]

0 голосов
/ 28 августа 2018

Я не знаю, почему вы используете handler внутри for, если ваш код печати требует фоновой обработки и обновите пользовательский интерфейс, попробуйте использовать AsyncTask , он имеет doInBackground, onProgressUpdate и onPostExecute, чтобы вы могли обрабатывать свой код более эффективно.

0 голосов
/ 28 августа 2018

Я это исправлю! Решение состоит из однострочных кодов -_- и я также добавляю переменную для 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]);

}

0 голосов
/ 28 августа 2018

Вы должны сделать var для ручки canceled status

Например, по вашему коду.

     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

...