Reputation: 365
I'm struggle with a strange issue. I'm trying to load a https web page, but the first time the webview doesn't load. After wait 60 seconds, I have to click again in my button to load my page. My device is a Nexus 4 with Lollipop, but this issue happens at devices with Android 4.4 and 4.1 as well. The URL doesn't have heavy content only a few javascript files and css files.
Log:
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!
My code:
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());
}
});
*/
I set a new WebClient() overriding the following methods: shouldOverrideUrlLoading, onLoadResource, onPageFinished.For tests purpose, I removed this custom WebClient but it still wasn't load at the first time.
Thanks
Upvotes: 17
Views: 14805
Reputation: 1
I solved same issue by adding webview to the layout from function onPageFinished(WebView view, String url)
, after it had finished loading.
Upvotes: -1
Reputation: 101
I met the same issue. I spent more than 3 days and found the cause it that another WebView object calls pauseTimers() for saving some CPU performance which actually " Pauses all layout, parsing, and JavaScript timers for all WebViews."
Upvotes: 3
Reputation: 573
Since you are loading an https url in webview, it will cause SSL certification issues so you have to override one more method for handling certification issue and handle it anyway here is the code how can you resolve it
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: if you want to enable javascript interface for your webview do the following procedure
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);
}
And the javascript code will go here
public void onPageStarted(WebView view, String url,Bitmap favicon) {
jsInterface.enablePreferencesMenu = false;
jsInterface.modalIsVisible = false;
jsInterface.urlForSharing = null;
bLoadingFinished = false;
}
Upvotes: 2
Reputation: 2218
Have you declared internet permission in androidmanifest.xml?
<manifest...>
.. .
<uses-permission android:name="android.permission.INTERNET" />
..
</manifest>
also try set a webview client.
//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);
}
}
});
Upvotes: -1