2

一部の顧客の電話で奇妙な問題が発生しています。サービスエリア外に何時間もいると、Android アプリがネットワークにアクセスできなくなるようです。Web ブラウザーや電子メールなどの他のアプリケーションは Web にアクセスできますが、私のアプリにはアクセスできません。

考えられる唯一の説明は、データ サービスがない場合にソケットが何らかの形でリークしているということです。

これが私のコードです:

String sendWebPOST(String url, String pPostData) throws IOException {
    AndroidHttpClient c = null;
    InputStream is = null;
    OutputStream os = null;
    int rc;
    String strResponse = null;

    try {            
        c = AndroidHttpClient.newInstance("Mobile");

        // Set the request method and headers
        HttpPost request = new HttpPost(url);
        request.addHeader("Content-Type", "application/x-www-form-urlencoded");

        request.setEntity(new StringEntity(pPostData));

        try {
            HttpResponse response = c.execute(request);

            // Getting the response code will open the connection,
            // send the request, and read the HTTP response headers.
            // The headers are stored until requested.
            rc = response.getStatusLine().getStatusCode();
            if (rc != HttpStatus.SC_OK) {
                throw new IOException("HTTP response code: " + rc);
            }

            try {
                is = response.getEntity().getContent();

                int ch;
                StringBuffer sb = new StringBuffer();
                while ((ch = is.read()) != -1) {
                    sb.append((char) ch);
                }
                //if(sb.length() > 0)
                strResponse = sb.toString();
            }
            finally {
                if (is != null) {
                    is.close();
                }
            }
        }
        finally {
            if (os != null) {
                os.close();
            }
        }
    }
    catch (ClassCastException e) {
        throw new IllegalArgumentException("Not an HTTP URL");
    }
    finally {
        if (c != null) {
            c.close();
        }
    }

    return strResponse;
}

この関数は、約 10 分ごとに呼び出され、リモート サーバーに更新を送信します。アプリがこの奇妙な状態になっても、ユーザーは引き続きアクティビティを開いたり、メニューを操作したりできるため、アプリは引き続き実行されます。ただし、ネットワーク経由で何も送信できません。

何が起こっているのでしょうか?

問題の電話は、T-Mobile ネットワークで Android 2.3 を実行している myTouch 4G と Samsung Galaxy II です。

ありがとう。

4

1 に答える 1

1

何らかの理由で、AndroidHttpClient の代わりに HttpURLConnection を使用した方がうまくいきます。コードをアップグレードすると、問題が報告されなくなりました。

 HttpURLConnection conn = null;
    InputStream is = null;
    OutputStream os = null;
    String strResponse = null;

    try {
        conn = (HttpURLConnection)(new URL(url)).openConnection();

        conn.setRequestMethod("POST");
        conn.setRequestProperty("Connection", "close");
        conn.setRequestProperty("content-type", "application/x-www-form-urlencoded");
        conn.setConnectTimeout(30000);
        conn.setDoInput(true);
        conn.setDoOutput(true);
        conn.setChunkedStreamingMode(0);
        conn.connect();

        os = new BufferedOutputStream(conn.getOutputStream());

        os.write(pPostData.getBytes());
        os.flush();

        // Getting the response code will open the connection,
        // send the request, and read the HTTP response headers.
        // The headers are stored until requested.
        int rc = conn.getResponseCode();
        if (rc != HttpURLConnection.HTTP_OK) {
            throw new IOException("HTTP response code: " + rc);
        }

        is = new BufferedInputStream(conn.getInputStream());

        int ch;
        StringBuffer sb = new StringBuffer();
        while ((ch = is.read()) != -1) {
            sb.append((char) ch);
        }
        //if(sb.length() > 0)
        strResponse = sb.toString();
    }
    finally {

        if (is != null) {
            try {
                is.close();
            }
            catch (Exception ex) {
                System.out.println("is.close ex " + ex);
            }
        }
        if (os != null) {
            try {
                os.close();
            }
            catch (Exception ex) {
                System.out.println("os.close ex " + ex);
            }
        }

        if (conn != null) {
            try {
                conn.disconnect();
            }
            catch (Exception ex) {
                System.out.println("disconnect ex " + ex);
            }
        }
    }
于 2012-07-07T22:49:15.227 に答える