2010-12-04 11 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レスポンス、またはHTTPレスポンスがない可能性があります。あなたの結果でコメントを投稿することは良い考えです。