2015-04-13 3 views
-2

Я работаю над java/android, используя поток, чтобы сделать линейного следящего робота с помощью nxt. Код содержит цикл while как истинный. Я хочу остановить это, когда захочу, установив его как false, но он отвечает только мгновение, а затем снова запускает цикл. В противном случае это заморозит приложение, потому что оно застряло в цикле. Может быть, я должен использовать поток обработчика? Я не могу использовать break, потому что он будет делать только одно раз, а затем остановится.Как остановить бесконечный цикл while при нажатии кнопки

Я новичок в java и, пожалуйста, поделитесь своими знаниями, если вы знаете что-либо относительно этого. Простите, если я не очень хорошо объясню свою проблему. спасибо

@Override 
    public void run(){ 

     threadRunning=true; 
     int min = 30, max = 37, readLight = 0, Mspeed = 90, Mspeed2 = 20; 
     LightSensor ls = new LightSensor(SensorPort.S3); 

     while(threadRunning){ 

      Motor.A.forward(); 
      Motor.C.forward(); 

       readLight = ls.readValue(); 
       LeJOSDroid.sendMessageToUIThread("Sensor: "+ls.readValue()); 

       if (readLight < min){ 
      readLight = min+1; 
       } 

       if (max < readLight){ 
       readLight = max-1; 
       } 

      Motor.C.setSpeed(Mspeed + (Mspeed2 * (readLight - min))); 
      Motor.A.setSpeed(Mspeed + (Mspeed2 * (max - readLight)));      

      } 

    } 
+4

Можете ли вы разместить свой код plz? – Maxouille

+0

Я думаю, что 'break;' это код, чтобы выйти из бесконечного цикла. – pheromix

+0

@pheromix, к сожалению, я хочу, чтобы цикл продолжал идти без каких-либо условий, чтобы остановить его, за исключением того, что я нажимаю кнопку или любое действие от пользователя, чтобы остановить ее. –

ответ

1

Предполагаю, что у вас есть кнопка в вашей деятельности. Если вы используете java-поток, вы можете вызвать метод interrupt(). Затем добавьте onClickListener к кнопке:

button.setOnClickListener(new View.OnClickListener() { 
    public void onClick(View v) { 
    yourThread.interrupt(); 
    } 
}); 

и используя вместо этого некоторого времени (истинное), вы можете использовать это вместо того, чтобы в вашу тему:

while(!Thread.currentThread().isInterrupted()) { 
    // do something here 
} 

Напомните мне, если мой ответ не хорошо ^^

+0

Я пробовал это решение, но почему-то это не влияет на цикл. Может быть, это произойдет только на короткое мгновение? –

+0

Вы можете добавить Log на свою кнопку, чтобы посмотреть, не влияет ли кнопка на поток. Используйте Log.i (TAG, String.valueOf (yourThread(). IsInterrupted())); –

+0

это сбой приложения, возможно, я сказал это неправильно? я пишу кнопку остановки журнала –

0

Используйте нить, как это:

private void runThread(){ 

    new Thread(new Runnable() { 

     @Override 
     public void run() { 
      while(!breakLoop){ 
       // do something in loop 
       Log.v("Thread", "- Running"); 
      } 
     } 
    }).start(); 
} 

и инициализировать флаг «breakLoop» ложными и OnClick из stop вы можете установить флаг в true.

Смежные вопросы