2016-07-29 69 views
5

我對Java編程頗爲陌生。現在我正在研究名爲Evercam的Android應用程序的源代碼。但是,我在理解涉及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}實際上沒有任何中斷有沒有退出?


編輯

我不好其實從反編譯從Android項目文件中提取這個片段直接。我不知道它會有所不同,然後再次,我知道的很少。這裏是原始的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. 
} 

原來在實際的代碼中有continue語句。非常感謝你的回覆,我會記住,不應該依賴於已編譯的類。

+0

你是否執行了代碼並試用? – sidgate

+0

雙重嵌套'while(true)'循環看起來多餘 - 只有一個會做。 –

+0

這確實看起來有點陰涼。 – Shaishav

回答

4

看起來像一個無限循環。要絕對確定,您必須靜態讀取每條語句並按照調用的方法來查看是否存在可能的調用,例如Activity#finish()Service#stopSelf(),這些調用將完成當前正在運行的活動,從而有效地打破循環。

另一種可能性是,該代碼旨在作爲後臺線程服務在無限循環中運行,而其他某個組件在達到特定條件時可以選擇終止該服務。例如,它可能是Runnable類的一部分,並在線程池中執行,並且當超時存在時,該池將關閉。

+1

我同意,並有適當的上下文,就像調用這段代碼的地方一樣,我們可以肯定地知道。 – Vucko

+0

謝謝!您實際上幫助我更多地瞭解了其超時行爲的Runnable類,並列出了許多可能性。 – daisura99

+2

@ daisura99'Runnable'是一個接口,而不是一個類,因此它沒有特定的行爲。 – m0skit0

0

從while循環中退出的唯一可能的方法是如果在循環中調用的某個方法拋出異常。檢查這些方法的代碼是否有異常或在此共享

0

沒有任何中斷的無限循環可能對服務在後臺運行有用。

您創建了一個新的線程,無限感謝一段時間(true),當您停止應用程序時,您只需要終止與服務相對應的進程。