Android - WebViewClient загружает страницы крайне медленно - PullRequest
2 голосов
/ 06 января 2011

Как разработчик, у меня были довольно неудачные опыты по созданию приложений (с веб-страницами), которые работают на веб-клиенте Android с подключением 3G. Некоторые из моих пользователей говорят, что загрузка некоторых страниц занимает до 10 минут. (Я не знаю, преувеличены ли они, потому что они разочарованы.) Лично я использую HTC Desire под управлением Android 2.2 и тестировал свои приложения на своем телефоне. Действительно, даже для приложений, которые используют локально хранящиеся веб-страницы для выполнения запросов AJAX, это очень медленно в 3G. Большую часть времени, это будет просто тайм-аут и покажет пустую страницу. Когда он работает по WIFI, он отлично работает и работает очень быстро.

Я слышал, многие говорят, что родной браузер на Android 2.2 очень быстрый. Для меня, однако, я должен сказать, что родное приложение браузера также очень медленно на 3G. Иногда главная страница Google для мобильных устройств даже не загружается. Я нахожусь в Сингапуре, поэтому в большинстве мест покрытие 3G должно быть в порядке.

Это аппаратное устройство, которое вызывает проблему?

1 Ответ

0 голосов
/ 16 декабря 2013

Мне не известно о проблемах производительности конкретного устройства, связанных, в частности, со временем загрузки 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) {...}
});
...