2011-08-20 90 views
0

我有一個是從後臺線程通過在localhost一個ServerSocket饋送的WebView。這工作得很好,但有時後臺線程會隨機停止接受請求(「網頁不可用」)。一段時間後,它會再次運行而不做任何更改,即不重新啓動線程或套接字或再次調用accept()的Android:的ServerSocket.accept()隨機凍結

編輯2:進一步的調查表明,WebView似乎對本地主機連接的(分開?)超時值是如此之小,有時服務器線程沒有得到一個機會來處理請求。作爲解決方法,我可以在調用WebClient.onReceivedError時重新加載頁面,最終加載頁面。任何人都有同樣的問題?

當我打開調試器時,可以看到服務器線程仍在正常運行,正在等待(阻止)ServerSocket.accept()方法(或更準確地說,在OSNetworkSystem.accept(...))。但是,accept()似乎沒有收到傳入的請求。

有什麼在我的代碼特殊:

ServerSocket serverSocket = new ServerSocket(port); 
serverSocket.setSoTimeout(0); 

while (!shutdown) { 
    Socket socket = null; 
    try { 
     socket = serverSocket.accept(); 
     // Parse request and create response 
    } catch (Exception e) { 
     // ... 
    } finally { 
     // ... close socket 
    } 
} 

我使用在Windows/Mac上相同的代碼,並沒有經歷過任何此類問題。

在我看來,這好像是Android中的一個錯誤,可能與電源管理優化有關。任何線索?

編輯:這個問題不會發生在Android 2.x,只有在Android 3.1(三星Galaxy Tab 10.1)上。

+0

什麼包含在你的問題的代碼?你是否在Activity中運行serverSocket? – elevine

+0

@elevine:serverSocket在另一個線程中運行,從Activity內部啓動。它不作爲服務運行。 –

+0

你能顯示更多你的活動代碼嗎?線程是如何創建的以及從哪裏開始的? – elevine

回答

0

此問題是Android中的一個錯誤。

我已經下http://code.google.com/p/android/issues/detail?id=19427

編輯提交bug報告:作爲一種變通方法,我添加了一些代碼,只要出現連接錯誤重新加載頁面。迄今爲止,這工作得很好。

webView.setWebViewClient(new WebViewClient(){ 
    String prevFailingUrl; 
    int retryCount; 
    @Override 
    public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) { 
     if (errorCode == WebViewClient.ERROR_CONNECT) { 
      if (failingUrl.equals(prevFailingUrl)) { 
       retryCount++; 
      } else { 
       retryCount = 1; 
      } 
      if (retryCount <= 3) { 
       webView.reload(); 
      } 
     } 
     prevFailingUrl = failingUrl; 
    } 
});