2011-01-06 62 views
2

作为一名开发人员,当谈到在3G连接上运行Android webviewclient的应用程序(带有网页)时,我遇到了很多不愉快的经历。我的一些用户说有些页面需要10分钟才能加载。 (我不知道他们是否夸张,因为他们感到沮丧。)就我个人而言,我使用运行Android 2.2的HTC Desire,并用我自己的手机测试了我的应用程序。事实上,即使对于使用本地存储的网页来制作AJAX请求的应用程序,它在3G上的速度也非常慢。大多数情况下,它只会暂停并显示一个空白页面。当它使用WIFI时,它可以正常工作并且速度非常快。Android - WebViewClient非常缓慢地加载页面

我听到很多人说Android 2.2上的本机浏览器速度非常快。对我而言,我必须说,原生浏览器应用在3G上也很慢。有时,Google移动主页甚至没有完成加载。我在新加坡,所以大多数地方的3G覆盖应该没问题。

是造成问题的设备硬件?

回答

0

我不知道与WebView加载时间特别相关的设备特定性能问题。但是,您可能希望添加请求超时和网络连接更改侦听器。有关其他信息,您可以请求并报告慢速请求的设备和连接信息。

handler = new Handler(); 
WebView webView = findViewById(R.id.webview); 
webView.setWebViewClient(new WebViewClient() { 
    final long WEBVIEW_REQUEST_TIMEOUT = ...; 
    final long WEBVIEW_SLOW_REQUEST_THRESHOLD = ...; 
    Runnable onRequestTimeout = null; 
    @Override 
    public void onPageStarted(WebView view, final String url, Bitmap favicon) { 
     super.onPageStarted(view, url, favicon); // current impl is no op but be fwd compatible 
     saveRequestStartTime(); 
     onRequestTimeout = new Runnable() { 
      @Override 
      public void run() { 
       handleRequestComplete(url, WebViewClient.ERROR_TIMEOUT); 
      } 
     }; 
     handler.postDelayed(onRequestTimeout, WEBVIEW_REQUEST_TIMEOUT); 
    } 

    @Override 
    public void onPageFinished(WebView view, String url) { 
     super.onPageFinished(view, url); // current impl is no op but be fwd compatible 
     handleRequestComplete(url, 0); // Return 0 onSuccess. All WebViewClient defined errors < 0. 
    } 

    @Override 
    public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) { 
     super.onReceivedError(view, errorCode, description, failingUrl); // current impl is no op but be fwd compatible 
     handleRequestComplete(failingUrl, errorCode); 
    } 

    private void handleRequestComplete(String url, int errorCode) { 
     if (onRequestTimeout != null) { 
      handler.removeCallbacks(onRequestTimeout); 
     } 
     onRequestTimeout = null; 
     final long elapsedTime = getRequestElapsedTime(); 
     if (elapsedTime > WEBVIEW_SLOW_REQUEST_THRESHOLD) { 
      reportSlowRequest(elapsedTime, url, errorCode); 
     } 
     clearRequestTime(); 
    } 

    private void saveRequestStartTime() {...} 
    private long getRequestElapsedTime() {...} 
    private void clearRequestTime() {...} 
    private void reportSlowRequest(long elapsedTime, String url, int errorCode) {...} 
});