2010-12-04 7 views
-1

방금 ​​인터넷에서 일부 코드를 시도하고 실행했지만 내 에뮬레이터를 차단했습니다. 코드는 다음과 같습니다.이 앱이 차단되는 이유가 무엇인가요?

public void getcontents() 
{ 
HttpConnection c = null; 
InputStream is = null; 
StringBuffer sb = new StringBuffer(); 
try 
{ 
    c = (HttpConnection)Connector.open("http://www.java-samples.com",Connector.READ_WRITE, true); 
    c.setRequestMethod(HttpConnection.GET); //default 
    is = c.openInputStream(); // transition to connected! 
    int ch = 0; 
    for(int ccnt=0; ccnt < 150; ccnt++) { // get the title. 
    ch = is.read(); 
    if (ch == -1){ 
     break; 
    } 
    sb.append((char)ch); 
    } 
} 
catch (IOException x){ 
x.printStackTrace(); 
} 
finally{ 
    try{ 
     is.close(); 
      c.close(); 
    } catch (IOException x){ 
      x.printStackTrace(); 
    } 
} 
System.out.println(sb.toString()); 
} 

OK 명령으로 함수를 호출했습니다.

프로세스를 죽일 때까지 에뮬레이터가 차단되었습니다. 어떻게 해결할 수 있습니까?

+0

Java에서 스레드를 구현하는 방법을 모르겠지만 제 생각에 프로그램이 스트림의 데이터를 기다리고 있습니다. 이 작업이 다소 시간이 걸리거나 기다리면 함수가 실행될 별도의 스레드가 만들어집니다. 그래서 getContents가 끝나기를 기다리지 않고 프로그램이 계속 실행됩니다. 그러나 이것은 단지 추측입니다. – PeeHaa

답변

1

디버거에서 코드를 단계별로 실행 해보세요. 최소한 로그 문을 추가하십시오. 내 생각 엔 스트림이 HTTP 연결에서 데이터를 기다리고 플러시되지는 않지만 그 어설 션을 확인하기 위해 코드를 실행하지 않은 것입니다.

1

코드에서 볼 수있는 유일한 루프는 for 루프 (150 회 반복하지 않음)입니다. 따라서 코드가 무기한 실행되지 않습니다.

내가 제안하는 것은 코드를 통해 다양한 지점에서 디버그 출력 명령문 (콘솔 또는 대화 상자 경고로 출력)을 배치하는 것입니다. 이렇게하면 문제의 원인이되는 코드 줄을 찾아 낼 수 있습니다. 예를 들어, for 루프 앞뒤에 줄을 긋고 실행하는 경우 첫 번째 줄만 표시되면 문제가 루프 내에 있음을 알 수 있습니다. 그런 다음 디버그 라인을 루프 (루프 번호 포함)에 넣음으로써 문제의 원인이되는 라인을 찾아내어 좁힐 수 있습니다.

0

서버에서 응답 본문을 읽기 전에 응답 코드를 확인하십시오. 그러면 연결이 성공했는지 확인하거나 오류 응답을 인쇄합니다. Connector.open()에 전화 후 다음 장소 :

  if (c.getResponseCode() != HttpConnection.HTTP_OK) { 
      throw new IOException("HTTP response code: " + c.getResponseCode()); 
     } else { 
      System.out.println("**Debug** : HTTP_OK received, connection established"); 
     } 

코드를 실행하는 다음 예외 또는 가능성 (인터넷에 에뮬레이터의 연결을 확인) 연결 시도에 차단하고 다음 HTTP 확인 중 어떠한 출력을 제공하지 않는 경우 . HTTP_OK를 얻으면 서버의 HTTP 응답을 차단하거나 부족할 수 있습니다. 결과와 함께 의견을 게시하는 것이 좋습니다.

관련 문제