0

HTTP 応答の文字列 (JSON オブジェクトのみ) を取得しようとしていますが、このコードが無限に待機することがあります。

line = reader.readLine()

このような動作の理由は、インターネット接続の不良 (私は 3G モデムを使用しています) かもしれませんが、この無限ロックを回避するための安定したソリューションが必要です。それを避けるためにここで何ができるでしょうか?

HttpResponse response = httpClient.execute(httpPost);

InputStream content = null;
JSONObject json_obj;
if (response.getStatusLine().getStatusCode() == 200) {
    HttpEntity entity = response.getEntity();

    try {
        content = entity.getContent();

        BufferedReader reader = new BufferedReader(new InputStreamReader(content, "UTF-8"), 256);
        StringBuilder sb = new StringBuilder();
        String line;
        while ((line = reader.readLine()) != null) {
            sb.append(line);
        }
    } catch (Exception e) {}
}
4

3 に答える 3

1

読み取りタイムアウトを指定できます。

HttpClient client = new DefaultHttpClient();
client.getParams().setParameter(CoreConnectionPNames.SO_TIMEOUT, 30000);

読み取りタイムアウトを 30 秒に設定する必要があります。おそらく、接続タイムアウトも指定する必要があります。

client.getParams().setParameter(CoreConnectionPNames.CONNECTION_TIMEOUT, 30000);
于 2012-11-06T16:09:10.457 に答える
0

「無限」ロックを回避するための良い解決策は、このhttp呼び出しを別のスレッドで実行し、ハンドラーを使用して、情報がロードされ、必要に応じて使用できることをメインスレッドに通知することです。

SaxParserを使用した私自身の例もここにあります:

public void SearchFromSuperClass(String text)
{   
    mHandler = new Handler();
    Thread t = new Thread(){
        public void run() {
            try {
              String strurl="URLTOPATH";
              URL url = new  URL(strurl);
              SAXParserFactory factory = SAXParserFactory.newInstance();

              SAXParser parser = factory.newSAXParser();
              FundsHandlerRanking handler = new FundsHandlerRanking();
              parser.parse(url.openConnection().getInputStream(), handler);
              search_response = handler.getrankings();


              mHandler.post(mUpdateResults);
            } catch (Exception e) {
                search_response = null;
                mHandler.post(mUpdateResults);

            }

        }
    };

    t.start();
}
final Runnable mUpdateResults = new Runnable() {
    public void run() {
        updateResultsInUi();
    }
};

private void updateResultsInUi() {

    try
    {
        if(search_response != null)
        {
            lview.setAdapter(new SearchRankingAdapter(mycontext, search_response, false));
        }
        Pdialog.dismiss();
    }
    catch (Exception e) {
        lview.setAdapter(null);
        if (Pdialog.isShowing())
        {
            Pdialog.dismiss();
        }
    }
}

mHandler.post(...)を使用すると、呼び出しをキューに入れてメインUIスレッドに送信し、そこで問題なくUIオブジェクトを変更できます(メインスレッドの外部のUIオブジェクトを変更することはできません)。

お役に立てれば

于 2012-11-06T16:15:28.373 に答える
0
readLine()

または、ネットワーク/IO をバックグラウンド スレッドで実行して、メイン スレッドのロックを防ぐ必要があります。

Android 4.0 以降でコードをテストすると、ネットワークがメイン スレッドで許可されなくなり、例外がスローされることもわかります。

バックグラウンド スレッドでこのようなタスクを実行するためのシンプルで簡単な方法であるAsyncTaskを見てください。

于 2012-11-06T16:11:03.983 に答える