Esdras
Esdras

Reputation: 365

Webview not loading at first time

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

Answers (4)

Hament Choudhary
Hament Choudhary

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

Dangui
Dangui

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

Bhavik Mehta
Bhavik Mehta

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

Thupten
Thupten

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

Related Questions