2

クラスのgetInputStreamメソッドで問題が発生しました。URLConnection他のスレッドで議論されている他の同様の問題がいくつかあることは承知していますが、私の場合、単一の解決策は機能していないようです。

面白いことに、最初の実行がうまくいくと、それ以降は失敗 (ブロック) します。この問題を説明する前に、背景を書きたいと思います。ここにあります。

基本的に、私は単純なクライアントサーバー構成を持っています。クライアント アプリでサーバー アドレスとポートをハードコーディングしたくないので、nginx実際の接続パラメーターを取得できる HTTP サーバー ( ) を使用します。

クライアント側には、サービスによって制御される「ネットワーク スレッド」があります。サービスはスレッドを開始し、必要に応じてスレッドを中断できます。run()メソッドの冒頭で、次の関数が呼び出されます。

private ConnectionParameters obtainConnectionParameters(String url) throws MalformedURLException, IOException {
    URLConnection connection = new URL(url).openConnection();
    InputStream in = connection.getInputStream(); // here the problem occurs

    ... // do some processing

    in.close();     
    return connectionParameters;
}

接続パラメーターが取得されると、別のソケット接続が開かれます。しばらくすると、スレッドが閉じられるか、単にrun()メソッドの最後に到達する可能性があります。きれいに終了することを再確認しました。

問題に戻ると、何が原因でこれが発生するのかわかりません。この動作を引き起こしている可能性のある手がかりはありますか?

サービスとネットワーク スレッドは、アクティビティとは別の (バックグラウンド) プロセスで実行されていることにも言及したいと思います。このプロセスでURLConnectionが使用される場所は他にありません。obtainConnectionParametersメソッドで使用されるすべての変数がローカルであることは注目に値します。

説明に欠けているものは何もないと思います。それ以外の場合はお知らせください。投稿を編集できます。

編集 (1):

スレッドMake an HTTP request with android のように apache HTTP client を試したところ 、うまくいきました。ただし、何が問題なのかを知りたいURLConnectionです。

4

1 に答える 1

1

私の理解が正しければ、上記のコード スニペットは複数回呼び出され、最初は正常に動作しますが、2 回目は getInputStream() 呼び出しでブロックされますか?

問題はサーバー側にある可能性があります。サーバーが一度に 1 つの接続しか受け入れず、最初に作成した接続がまだ開いている可能性がありますか? サーバーが期待どおりに動作することを確認するために、ブラウザーで URL を複数回開くことは可能ですか?

于 2013-03-04T20:22:50.657 に答える