2012-02-02 25 views
0

私はcomet URLリンクからjson文字列を取得しようとしています。ここで長いポーリング(彗星)でHttpURLConnectionのタイムアウト - android

は、APIのリンクです:ここhttp://www.plurk.com/API#realtime は説明です:

You'll get an URL from /APP/Realtime/getUserChannel and you do GET requests to this URL to get new data. Your request will sleep for about 50 seconds before returning a response if there is no new data added to your channel. You won't get notifications on responses that the logged in user adds, but you will get notifications for new plurks.

私はcomet_serverのURLを取得するとFirefoxにそれを貼り付けて、手動で結果を得ることができました。しかし、私はアンドロイドでこれらのjson文字列を取得しようとすると、私はタイムアウトエラーが発生しました。

01:48:51.698 com.net.xerothermic.plurk INFO PLURK http://comet58.plurk.com:80/comet?channel=...&offset=0

01:53:43.680 com.net.xerothermic.plurk ERROR PLURK HTTP con. get response error:Connection timed out

ここでは、データの取得に使用したコードを示します。

URL url = new URL(urlString); 
    HttpURLConnection conn = null; 
    try 
    { 
     conn = (HttpURLConnection) url.openConnection(); 
    } 
    catch (IOException ex) 
    { 
     Log.e("PLURK", "HTTP con. open error:" + ex.getMessage()); 
     return ""; 
    } 
    try 
    { 
     conn.setRequestMethod("GET"); 
    } 
    catch (ProtocolException ex) 
    { 
     Log.e("PLURK", "HTTP con. set method error:" + ex.getMessage()); 
    } 
    try 
    { 
     return conn.getResponseMessage(); 
    } 
    catch (IOException ex) 
    { 
     Log.e("PLURK", "HTTP con. get response error:" + ex.getMessage()); 
     return ""; 
    } 

ご迷惑をおかけして申し訳ありません。

EDIT:ここはブラウザからの出力です。私はいくつかのプロパティを設定するのを忘れましたか? enter image description here

+1

おそらく読み取りタイムアウトを増やす必要がある - あなたが受け取るメッセージが明示的に読み込みがタイムアウトしたと述べているので。 [こちら](http://docs.oracle.com/javase/1.5.0/docs/api/java/net/URLConnection.html#setReadTimeout%28int%29)(たとえば)を参照してください。 – Jens

+0

ええ、私もそれについて考えます。しかし、デフォルトのタイムアウト値は0です。つまり、永久に待機する必要があります。ログからは、タイムアウト(〜5分)を生成するのに50秒以上かかることがあります。 – Patrick

+0

@Jensあなたは正しいです!デフォルトのタイムアウト値は0に設定されていましたが、手動でタイムアウト値を設定する必要があります。 70000(70秒)に設定した後、プログラムは正常に実行されました。奇妙なことに、PC上で実行される同じコードにはこれらの動作がなく、タイムアウト値を設定する必要はありませんでした。 – Patrick

答えて

0

タイムアウト値がデフォルトで0に設定されていても(無限待機を意味する)、IOExceptionを発生させないためにタイムアウト値を明示的に設定する必要があることがわかりました。これが唯一のアンドロイドではなく、Windows上で必要とされている

setConnectTimeout(70000); 
setReadTimeout(70000); 

...

+0

もう一度壊れました... – Patrick

+0

私はそれがちょうど安定していないと思います。結論を導くために、さらにWi-Fiスポットを試す必要があります。 – Patrick

+0

この問題に関心のある方は、アプリケーション(つまりTwitter)にWebコールバックURLを設定してください。なぜそれが必要なのか分かりませんが、一度設定すると問題なく動作します。 – Patrick

関連する問題