2016-07-29 7 views
5

私はJavaプログラミングには全く新しいです。今のところ私はEvercamというアンドロイドアプリのソースコードを勉強しています。しかし、while(真)ループを含むコードの一部を理解するのに問題があります。ここで中断のないwhile(真の)ループ

は、コードの抜粋です:

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}が実際には何も出てこない場合は誰でもが壊れていて、それがかそれともでも出口であることを誰にでも教えていただければ幸いです。


EDIT

私の悪い、実際に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ループを終了する唯一の方法は、ループで呼び出されているメソッドの1つが例外をスローする場合です。これらのメソッドのコードで例外をチェックするか、ここで共有してください。

0

のサービスでは、無制限の無限ループが役立ちます。

サービスを無限に行っている新しいスレッドを作成すると(真)、アプリケーションを停止するとサービスに対応するプロセスを単に終了させることができます。

関連する問題