Веб-просмотр не загружается в первый раз
Я борюсь со странной проблемой. Я пытаюсь загрузить https-страницу, но в первый раз веб-просмотр не загружается. После ожидания 60 секунд, я должен нажать еще раз на моей кнопке, чтобы загрузить мою страницу. Мое устройство - Nexus 4 с Lollipop, но эта проблема возникает и на устройствах с Android 4.4 и 4.1. URL-адрес не содержит тяжелого содержимого только нескольких файлов javascript и файлов css.
Журнал:
I/WebViewFactory﹕ Loading com.google.android.webview version 37 (1602158-arm) (code 111201)
I/LibraryLoader﹕ Loading: webviewchromium
I/LibraryLoader﹕ Time to load native libraries: 3 ms (timestamps 5331-5334)
I/LibraryLoader﹕ Expected native library version number "",actual native library version number ""
I/LibraryLoader﹕ Expected native library version number "",actual native library version number ""
I/chromium﹕ [INFO:library_loader_hooks.cc(106)] Chromium logging enabled: level = 0, default verbosity = 0
I/BrowserStartupController﹕ Initializing chromium process, renderers=0
W/art﹕ Attempt to remove local handle scope entry from IRT, ignoring
W/chromium﹕ [WARNING:resource_bundle.cc(315)] locale_file_path.empty()
I/chromium﹕ [INFO:aw_browser_main_parts.cc(63)] Load from apk succesful, fd=72 off=159196 len=3264
I/chromium﹕ [INFO:aw_browser_main_parts.cc(78)] Loading webviewchromium.pak from, fd:73 off:229484 len:643667
W/AudioManagerAndroid﹕ Requires BLUETOOTH permission
W/chromium﹕ [WARNING:proxy_service.cc(901)] PAC support disabled because there is no system implementation
W/chromium﹕ [WARNING:data_reduction_proxy_settings.cc(403)] SPDY proxy OFF at startup
W/art﹕ Attempt to remove local handle scope entry from IRT, ignoring
W/AwContents﹕ onDetachedFromWindow called when already detached. Ignoring
I/chromium﹕ [INFO:SkUtilsArm.cpp(179)] Device supports ARM NEON instructions!
Мой код:
final WebView wv = (WebView) alert.findViewById(R.id.modal_wv);
wv.getSettings().setAppCacheEnabled(true);
wv.getSettings().setCacheMode(WebSettings.LOAD_DEFAULT);
wv.getSettings().setAppCachePath("/data/data/" + getPackageName() + "/cache");
wv.getSettings().setAllowFileAccess(true);
wv.getSettings().setJavaScriptEnabled(true);
wv.loadUrl(connectionResponse.getUrl());
/*
//Same behavior ...
wv.post(new Runnable() {
@Override
public void run() {
wv.loadUrl(connectionResponse.getUrl());
}
});
*/
Я установил новый WebClient(), переопределяя следующие методы: shouldOverrideUrlLoading, onLoadResource, onPageFinished. Для целей тестирования я удалил этот настраиваемый WebClient, но он все еще не был загружен в первый раз.
Спасибо
Ответы
Ответ 1
Я встретил ту же проблему. Я потратил более 3 дней и нашел причину того, что другой объект WebView вызывает pauseTimers() для сохранения некоторой производительности ЦП, которая фактически "приостанавливает весь макет, синтаксический анализ и таймеры JavaScript для всех WebView".
Ответ 2
Поскольку вы загружаете URL-адрес https в webview, это вызовет проблемы с сертификацией SSL
поэтому вам придется переопределить еще один метод обработки проблемы сертификации и обрабатывать его в любом случае
вот код, как вы можете его решить.
myWebView.setWebViewClient(new WebViewClient() {
@Override
public void onReceivedError(WebView view, int errorCode,
String description, String failingUrl) {
Toast.makeText(MainActivity.this, description,
Toast.LENGTH_SHORT).show();
}
@Override
public void onReceivedSslError(WebView view,
SslErrorHandler handler, SslError error) {
// TODO Auto-generated method stub
// this method will proceed your url however if certification issues are there or not
handler.proceed();
}
});
myWebView.loadUrl(url);
EDIT:, если вы хотите включить интерфейс javascript для своего веб-просмотра
выполните следующую процедуру.
private JavascriptInterface jsInterface;
engine.getSettings().setJavaScriptEnabled(true);
jsInterface = new JavascriptInterface();
try {
ComponentName comp = new ComponentName(this, Dashboard.class);
PackageInfo pinfo = getPackageManager().getPackageInfo(comp.getPackageName(), 0);
jsInterface.versionCode = pinfo.versionCode;
} catch (android.content.pm.PackageManager.NameNotFoundException e) {
}
engine.addJavascriptInterface(jsInterface, "androidlearnscripture");
engine.requestFocus(View.FOCUS_DOWN);
}
И код javascript пойдет здесь
public void onPageStarted(WebView view, String url,Bitmap favicon) {
jsInterface.enablePreferencesMenu = false;
jsInterface.modalIsVisible = false;
jsInterface.urlForSharing = null;
bLoadingFinished = false;
}
Ответ 3
Я решил такую же проблему, добавив webview в макет из функции onPageFinished(WebView view, String url)
после того, как он закончил загрузку.
Ответ 4
Вы объявили интернет-разрешение в androidmanifest.xml?
<manifest...>
.. .
<uses-permission android:name="android.permission.INTERNET" />
..
</manifest>
также попробуйте установить клиент webview.
//default browser
wv.setWebViewClient(new WebViewClient() {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url)
{
L.log(url);
return super.shouldOverrideUrlLoading(view, url);
}
});
//chrome browser
wv.setWebChromeClient(new WebChromeClient() {
public void onProgressChanged(WebView view, int progress)
{
progressBar.setProgress(progress);
if (progress == 100) {
progressBar.setVisibility(View.GONE);
}
}
});