2016-07-29 3 views
5

Я довольно новичок в программировании на Java. Пока я изучаю исходный код приложения Android под названием Evercam. Однако у меня есть проблема с пониманием части кода, которая включает в себя цикл while (true).while (true) loop without break

Вот фрагмент кода:

while (true) 
{ 
    while (true) 
    { 
     byte[] responseMessageByteArray = new byte[4000]; 
     DatagramPacket datagramPacketRecieve = new DatagramPacket(responseMessageByteArray, responseMessageByteArray.length); 
     datagramSocket.receive(datagramPacketRecieve); 
     String responseMessage = new String(datagramPacketRecieve.getData()); 
     EvercamDiscover.printLogMessage("\nResponse Message:\n" + responseMessage); 
     StringReader stringReader = new StringReader(responseMessage); 
     InputNode localInputNode = NodeBuilder.read(stringReader); 
     EnvelopeProbeMatches localEnvelopeProbeMatches = (EnvelopeProbeMatches)(new Persister()).read(EnvelopeProbeMatches.class, localInputNode); 
     if (localEnvelopeProbeMatches.BodyProbeMatches.ProbeMatches.listProbeMatches.size() > 0) 
     { 
      ProbeMatch localProbeMatch = (ProbeMatch) localEnvelopeProbeMatches.BodyProbeMatches.ProbeMatches.listProbeMatches.get(0); 
      if (uuidArrayList.contains(localProbeMatch.EndpointReference.Address)) 
      { 
       EvercamDiscover.printLogMessage("ONVIFDiscovery: Address " + localProbeMatch.EndpointReference.Address + " already added"); 
      } 
      else 
      { 
       uuidArrayList.add(localProbeMatch.EndpointReference.Address); 
       DiscoveredCamera discoveredCamera = getCameraFromProbeMatch(localProbeMatch); 
       if (discoveredCamera.hasValidIpv4Address()) 
       { 
        this.onActiveOnvifDevice(discoveredCamera); 
        cameraList.add(discoveredCamera); 
       } 
      } 
     } 
    } 
} 

Не это создает бесконечный цикл? Мои основные принципы на Java не являются сильными, поэтому я был бы так благодарен, если кто-нибудь сможет сказать, в каких случаях while(true){//codes} фактически выйдет без каких-либо break или делает это exit ??


EDIT

Мой плохо на самом деле извлечения этого фрагмента из декомпиляции непосредственно от андроида файлов проекта. Я не знал, что это будет по-другому, и опять же, я знаю очень мало. Вот оригинал code:

public ArrayList<DiscoveredCamera> probe() { 
ArrayList<DiscoveredCamera> cameraList = new ArrayList<DiscoveredCamera>(); 

try { 
    DatagramSocket datagramSocket = new DatagramSocket(); 
    datagramSocket.setSoTimeout(SOCKET_TIMEOUT); 
    InetAddress multicastAddress = InetAddress.getByName(PROBE_IP); 

    if (multicastAddress == null) { 
    // System.out.println("InetAddress.getByName() for multicast returns null"); 
    return cameraList; 
    } 

    // Send the UDP probe message 
    String soapMessage = getProbeSoapMessage(); 
    // System.out.println(soapMessage); 
    byte[] soapMessageByteArray = soapMessage.getBytes(); 
    DatagramPacket datagramPacketSend = new DatagramPacket(
     soapMessageByteArray, soapMessageByteArray.length, 
     multicastAddress, PROBE_PORT); 
    datagramSocket.send(datagramPacketSend); 

    ArrayList<String> uuidArrayList = new ArrayList<String>(); 
    while (true) { 
    // System.out.println("Receiving..."); 
    byte[] responseMessageByteArray = new byte[4000]; 
    DatagramPacket datagramPacketRecieve = new DatagramPacket(
     responseMessageByteArray, 
     responseMessageByteArray.length); 
    datagramSocket.receive(datagramPacketRecieve); 

    String responseMessage = new String(
     datagramPacketRecieve.getData()); 

    EvercamDiscover.printLogMessage("\nResponse Message:\n" 
     + responseMessage); 

    StringReader stringReader = new StringReader(responseMessage); 
    InputNode localInputNode = NodeBuilder.read(stringReader); 
    EnvelopeProbeMatches localEnvelopeProbeMatches = new Persister() 
     .read(EnvelopeProbeMatches.class, localInputNode); 
    if (localEnvelopeProbeMatches.BodyProbeMatches.ProbeMatches.listProbeMatches 
     .size() <= 0) { 
     continue; 
    } 

    ProbeMatch localProbeMatch = localEnvelopeProbeMatches.BodyProbeMatches.ProbeMatches.listProbeMatches 
     .get(0); 
    // EvercamDiscover.printLogMessage("Probe matches with UUID:\n" 
    // + 
    // localProbeMatch.EndpointReference.Address + " URL: " + 
    // localProbeMatch.XAddrs); 
    if (uuidArrayList 
     .contains(localProbeMatch.EndpointReference.Address)) { 
     EvercamDiscover.printLogMessage("ONVIFDiscovery: Address " 
      + localProbeMatch.EndpointReference.Address 
      + " already added"); 
     continue; 
    } 
    uuidArrayList.add(localProbeMatch.EndpointReference.Address); 
    DiscoveredCamera discoveredCamera = getCameraFromProbeMatch(localProbeMatch); 

    if (discoveredCamera.hasValidIpv4Address()) { 
     onActiveOnvifDevice(discoveredCamera); 
     cameraList.add(discoveredCamera); 
    } 
    } 
} catch (Exception e) { 
    // ONVIF timeout. Don't print anything. 
} 

Оказывается, есть продолжают заявление в реальном коде. Огромное вам спасибо за ответ, я буду помнить, что на скомпилированные классы не следует зависеть.

+0

Вы выполнили код и попробуете его? – sidgate

+0

Дважды вложенные 'while (true)' loops кажутся избыточными - только один будет делать. –

+0

Это выглядит немного теневым. – Shaishav

ответ

4

Этот выглядит как бесконечный цикл. Чтобы быть абсолютно уверенным, вам нужно было бы статически читать каждый оператор и следовать вызываемым методам, чтобы увидеть, существуют ли какие-либо возможные вызовы вроде Activity#finish() или Service#stopSelf(), которые завершили бы текущую активность, эффективно нарушая цикл.

Другая возможность заключается в том, что код предназначен для работы в бесконечном цикле в качестве службы потока фона, а у другого компонента есть возможность убить эту службу, когда она достигнет определенного условия. Например, он может быть частью класса Runnable и выполнен в пуле потоков, а когда существует тайм-аут, пул отключается.

+1

Я согласен, и с надлежащим контекстом, например, когда этот код вызывается, мы могли бы точно знать. – Vucko

+0

спасибо! вы на самом деле помогли мне больше узнать о классе Runnable его тайм-аута и перечислении многих возможностей. – daisura99

+2

@ daisura99 «Runnable» - это интерфейс, а не класс, и поэтому он не имеет определенного поведения. – m0skit0

0

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

0

Бесконечные петли без разрывов могут быть полезны для Служба работает в фоновом режиме.

Вы создаете новую тему, выполняющую бесконечную службу, и, когда вы останавливаете приложение, вы просто убиваете процесс, соответствующий службе.