Android: 3G إلى WiFi Switch أثناء وجوده في الوسط على التطبيق = فقدان اتصال الشبكة

StackOverflow https://stackoverflow.com/questions/4347507

سؤال

أنا أواجه مشكلة مزعجة مع HTC Legend (Android 2.2). عدم رؤية هذه المشكلة على Xperia ، Galaxy ، Nexus ، إلخ.

عندما أقوم بتشغيل تطبيقي على اتصال 3G ، أحضر بعض البيانات ، ثم انتقل إلى إعدادات الهاتف وتمكين WiFi ، يحصل الهاتف تلقائيًا على اتصال WiFi يفضله على 3G. المشكلة هي أنه بمجرد أن أعود إلى التطبيق ، يبدو أنه فقد جميع الشبكة Connectivty وغير قادر على الاتصال بأي شيء. ومع ذلك ، فإن التطبيقات الأخرى ، مثل متصفح الويب على سبيل المثال ، لا توجد مشكلة في استخدام اتصال WiFi الجديد. Ping يعمل بشكل جيد من قذيفة الهاتف.

إذا انتظرت لفترة كافية ، (على سبيل المثال 15 دقيقة) ، يبدو أن مكدس الشبكة يقوم بإصلاح نفسه تلقائيًا ويكون تطبيقي قادرًا على إجراء اتصالات الشبكة مرة أخرى. بالطبع ، هذا التأخير غير مقبول.

هل هناك طريقة لإعادة دائرة الشبكة برمجياً؟ أقوم بإنشاء java.net.httpurlconnection في كل مرة ، ومع ذلك ، لا يزال يتم الحصول على واي فاي.

شكرًا

شفرة:

byte[] response = null;
    HttpURLConnection connection = null;
    int responseCode = -1;

    // check the cache first
    String readyResponse = ResponseCache.getInstance().get(getUrl());
    if (readyResponse != null) {
        Log.d(LOG_TAG, "Returning CACHED server response for " + getUrl());
        return readyResponse.getBytes();
    }

    try {

        URL url = new URL(getUrl());
        Log.i(LOG_TAG, "Sending Request: " + url.toExternalForm());

        connection = (HttpURLConnection) url.openConnection();
        connection.setUseCaches(false);
        connection.setDoOutput(true); 
        connection.setDoInput(true);
        connection.setConnectTimeout(ApplicationConfiguration.HTTP_CONNECT_TIMEOUT);
        connection.setReadTimeout(ApplicationConfiguration.HTTP_READ_TIMEOUT);

        if (BuildType.getHTTPMethod() == BuildType.METHOD_GET)
        {
            connection.setRequestMethod("GET");
        }
        else
        {
            connection.setRequestMethod("POST");
            connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");

            String body = getParameters();
            connection.setRequestProperty("Content-Length", Integer.toString(body.length()));

            OutputStreamWriter wr = new OutputStreamWriter(connection.getOutputStream());
            wr.write(getParameters());
            wr.flush(); 
        }



        connection.connect();

        responseCode = connection.getResponseCode();

و Stacktrace

E/xxx.yyy.zzz(  927): java.net.SocketTimeoutException: Read timed out
E/xxx.yyy.zzz(  927):  at org.apache.harmony.xnet.provider.jsse.OpenSSLSocketImpl.nativeread(Native Method)
E/xxx.yyy.zzz(  927):  at org.apache.harmony.xnet.provider.jsse.OpenSSLSocketImpl.access$200(OpenSSLSocketImpl.java:55)
E/xxx.yyy.zzz(  927):  at org.apache.harmony.xnet.provider.jsse.OpenSSLSocketImpl$SSLInputStream.read(OpenSSLSocketImpl.java:532)
E/xxx.yyy.zzz(  927):  at org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnectionImpl.readln(HttpURLConnectionImpl.java:1279)
E/xxx.yyy.zzz(  927):  at org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnectionImpl.readServerResponse(HttpURLConnectionImpl.java:1351)
E/xxx.yyy.zzz(  927):  at org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnectionImpl.sendRequest(HttpURLConnectionImpl.java:1339)
E/xxx.yyy.zzz(  927):  at org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnectionImpl.doRequestInternal(HttpURLConnectionImpl.java:1656)
E/xxx.yyy.zzz(  927):  at org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnectionImpl.doRequest(HttpURLConnectionImpl.java:1649)
E/xxx.yyy.zzz(  927):  at org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnectionImpl.getResponseCode(HttpURLConnectionImpl.java:1374)
E/xxx.yyy.zzz(  927):  at org.apache.harmony.luni.internal.net.www.protocol.https.HttpsURLConnectionImpl.getResponseCode(HttpsURLConnectionImpl.java:117)
E/xxx.yyy.zzz(  927):  at xxx.yyy.zzz.executeRequest(zzz.java:95)
هل كانت مفيدة؟

المحلول

أرى أن لديك SockettimeOutException ، ربما يمكنك التقاط هذا الاستثناء والاتصال باستخدام مأخذ توصيل جديد؟

نصائح أخرى

هناك خطأ يتسبب في إعادة استخدام النظام على اتصالات HTTP القديمة. يجب أن يحل المشكلة على خاصية النظام http.keepalive إلى false المشكلة:

System.setProperty("http.keepAlive", "false");
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top