2010-12-03 12 views
5

Tôi đang gặp sự cố gây phiền toái với HTC Legend (Android 2.2). Không thấy vấn đề này trên Xperia, Galaxy, Nexus, v.v.Android: Chuyển đổi 3G sang WIFI khi đang ở giữa ứng dụng = mất kết nối mạng

Khi tôi khởi chạy ứng dụng của mình trên kết nối 3G, tìm nạp dữ liệu, sau đó vào điện thoại Cài đặt và bật WIFI, điện thoại sẽ tự động nhận kết nối WIFI được ưu tiên qua 3G. Vấn đề là, một khi tôi chuyển trở lại ứng dụng, nó dường như đã mất tất cả kết nối mạng và không thể kết nối với bất kỳ thứ gì. Tuy nhiên, các ứng dụng khác, như Trình duyệt web chẳng hạn, không có vấn đề gì khi sử dụng kết nối Wifi mới. Ping hoạt động tốt từ vỏ của điện thoại.

Nếu tôi chờ đủ lâu, (ví dụ: 15 phút), ngăn xếp mạng dường như tự động sửa chữa và ứng dụng của tôi có thể thực hiện kết nối mạng một lần nữa. Tất nhiên, sự chậm trễ này là không thể chấp nhận được.

Có cách nào để khởi động lại ngăn xếp mạng theo chương trình không? Tôi tạo ra một java.net.HttpURLConnection mới mỗi lần, nhưng nó vẫn lần ra một khi WIFI đã được mua lại.

Cảm ơn

Code:

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(); 

Và 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) 

Trả lời

1

tôi thấy bạn có một SocketTimeoutException, có lẽ bạn có thể bắt ngoại lệ này và kết nối sử dụng một socket mới?

+0

có, giải pháp của tôi cũng tương tự như đề nghị của bạn, thêm vào đó, tôi đặt setConnectTimeout() và setReadTimeout() để giá trị rất thấp và chỉ cần giữ đập tại URL cho đến khi có được một socket hợp lệ. – Saideira