2016-07-29 17 views
5

Ich bin ziemlich neu in Java-Programmierung. Momentan studiere ich den Quellcode einer Android-App namens Evercam. Allerdings habe ich ein Problem, einen Teil des Codes zu verstehen, der eine (echte) Schleife beinhaltet. Hierwhile (true) Schleife ohne Pause

ist der Ausschnitt aus dem Code:

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); 
       } 
      } 
     } 
    } 
} 

Ist das nicht eine Endlosschleife erstellen? Meine Grundlagen in Java ist nicht stark, also wäre ich so dankbar, wenn irgendjemand sagen kann, in welchen Fällen ein while(true){//codes} tatsächlich ohne irgendwelche Bruch bricht oder tut es überhaupt Ausgang?


EDIT

Mein schlecht für tatsächlich diese Schnipsel aus decompiling Extrahieren direkt aus den Android-Projektdateien. Ich wusste nicht, dass es anders sein würde, und dann wieder, ich weiß sehr wenig. Hier ist das Original 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. 
} 

Es stellte sich heraus gibt es Aussage in den eigentlichen Code fortzusetzen. Vielen Dank für die Antwort, ich werde mich erinnern, dass de-kompilierte Klassen nicht davon abhängig sein sollten.

+0

haben Sie den Code ausgeführt und probieren Sie es aus? – sidgate

+0

Die doppelt verschachtelten 'while (true)' Loops scheinen überflüssig zu sein - nur einer würde es tun. –

+0

Das sieht ein bisschen zwielichtig aus. – Shaishav

Antwort

4

Diese sieht wie eine Endlosschleife. Um absolut sicher zu sein, müssten Sie jede Anweisung statisch lesen und den aufgerufenen Methoden folgen, um zu sehen, ob mögliche Aufrufe wie Activity#finish() oder Service#stopSelf() existieren, die die aktuell laufende Aktivität beenden würden, die Schleife effektiv durchbrechend.

Eine andere Möglichkeit besteht darin, dass der Code in einer Endlosschleife als Hintergrundthreaddienst ausgeführt werden soll, und eine andere Komponente eine Option zum Beenden dieses Dienstes haben könnte, wenn eine bestimmte Bedingung erfüllt ist. Beispielsweise könnte es Teil einer Runnable-Klasse sein und in einem Threadpool ausgeführt werden, und wenn ein Zeitlimit vorhanden ist, wird der Pool heruntergefahren.

+1

Ich stimme zu, und mit einem richtigen Kontext, wie wo dieser Code aufgerufen wird, konnten wir sicher wissen. – Vucko

+0

danke! Sie haben mir dabei geholfen, mehr über die Runtime-Klasse ihres Timeout-Verhaltens zu erfahren und die vielen Möglichkeiten aufzulisten. – daisura99

+2

@ daisura99 'Runnable' ist eine Schnittstelle, keine Klasse und hat daher kein spezifisches Verhalten. – m0skit0

0

Die einzige Möglichkeit zum Beenden der while-Schleife ist, wenn eine der Methoden, die in loop aufgerufen werden, eine Ausnahme auslöst. Überprüfen Sie Code dieser Methoden für Ausnahme oder teilen Sie es hier

0

Infinite Schleifen ohne Unterbrechungen könnte nützlich sein für eine Dienst im Hintergrund läuft.

Sie erstellen einen neuen Thread, der den Dienst unendlich lange ausführt (true) und wenn Sie Ihre Anwendung beenden, beenden Sie einfach den Prozess, der dem Dienst entspricht.