2011-01-06 4 views
2

Как разработчик, у меня были довольно плохие впечатления, когда дело доходило до создания приложений (с веб-страницами), которые запускаются на веб-клиенте Android на 3G-соединении. Некоторые из моих пользователей говорят, что некоторые страницы занимают до 10 минут для загрузки. (Я не знаю, преувеличены ли они, потому что они расстроены.) Лично я использую HTC Desire под управлением Android 2.2 и проверял свои приложения на своем телефоне. Действительно, даже для приложений, которые используют локально сохраненные веб-страницы для выполнения запросов 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) {...} 
}); 
Смежные вопросы