2016-07-29 7 views
5

मैं जावा प्रोग्रामिंग के लिए काफी नया हूं। अभी के लिए मैं एवरकैम नामक एक एंड्रॉइड ऐप का स्रोत कोड पढ़ रहा हूं। हालांकि, मुझे कोड के एक हिस्से को समझने में समस्या है जिसमें (सत्य) लूप शामिल है।जबकि (सत्य) लूप बिना ब्रेक

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

इस अनंत लूप का निर्माण नहीं करता:

यहाँ कोड का स्निपेट है? जावा में मेरे मूलभूत सिद्धांत मजबूत नहीं हैं, इसलिए अगर कोई इस बात में बता सकता है कि while(true){//codes} वास्तव में किसी भी ब्रेक के बिना बाहर निकलता है या कभी बाहर निकलता है तो मैं बहुत आभारी हूं ??


संपादित

मेरे बुरा वास्तव में एंड्रॉयड परियोजना फाइलों से सीधे decompiling से इस स्निपेट निकालने के लिए। मुझे नहीं पता था कि यह अलग होगा, और फिर, मुझे बहुत कम पता है। यहाँ मूल 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

दोगुनी-नेस्टेड 'जबकि (सत्य) 'लूप अनावश्यक प्रतीत होता है - बस एक ही करेगा। –

+0

यह थोड़ा सा छाया दिखता है। – Shaishav

उत्तर

4

यह एक अनंत लूप की तरह दिखता है। पूरी तरह से सुनिश्चित करने के लिए, आपको प्रत्येक कथन को स्थाई रूप से पढ़ना होगा और यह देखने के लिए आमंत्रित किया जाना चाहिए कि Activity#finish() या Service#stopSelf() जैसी कोई भी संभावित चालान मौजूद है जो वर्तमान में चल रही गतिविधि को समाप्त कर देगी, प्रभावी ढंग से लूप को तोड़ देगी।

एक और संभावना यह है कि कोड पृष्ठभूमि थ्रेड सेवा के रूप में एक अनंत लूप में चलने का इरादा है, और कुछ अन्य घटक के पास उस सेवा को मारने का विकल्प होगा जब यह किसी निश्चित स्थिति तक पहुंच जाए। उदाहरण के लिए, यह Runnable वर्ग का हिस्सा हो सकता है और थ्रेड पूल में निष्पादित किया जा सकता है, और जब टाइमआउट मौजूद होता है, तो पूल बंद हो जाता है।

+1

मैं सहमत हूं, और एक उचित संदर्भ के साथ, जहां यह कोड कहलाया जा रहा है, हम निश्चित रूप से जान सकते हैं। – Vucko

+0

धन्यवाद! आपने वास्तव में मुझे अपने टाइमआउट व्यवहार के चलने योग्य वर्ग और कई संभावनाओं को सूचीबद्ध करने के बारे में और अधिक समझने में मदद की। – daisura99

+2

@ daisura99 'रननेबल' एक इंटरफ़ेस है, कक्षा नहीं, और इस तरह इसका कोई विशिष्ट व्यवहार नहीं है। – m0skit0

0

लूप में से बाहर निकलने का एकमात्र संभावित तरीका है यदि लूप में बुलाए जाने वाले तरीकों में से एक अपवाद फेंकता है। अपवाद के लिए इन तरीकों का कोड जांचें या इसे यहां साझा करें

0

किसी भी ब्रेक के बिना अनंत लूप पृष्ठभूमि में चल रही सेवा के लिए उपयोगी हो सकता है।

आप थोड़ी देर के लिए असीम धन्यवाद सेवा करते हुए एक नया थ्रेड बनाते हैं (सत्य) और जब आप अपना आवेदन बंद करते हैं तो आप बस सेवा से संबंधित प्रक्रिया को मार देते हैं।

संबंधित मुद्दे