EDECoder
EDECoder

Reputation: 59

onPageFinished method is called BEFORE the website finishes loading?

It seems that I made some inaccuracies or I missed something regarding public class myWebViewClient class and public void onPageFinished(WebView view, String url). Initially and in the beginning I tried to launch www.yahoo.com and after it finishes loading I fire a toast from inside the public void onPageFinished(WebView view, String url) as indication to me the loading of the www.yahoo.com is finished, and up to here every thing is fine. Inside my RelativeLayout I have a button and edittext and my webview is layedout-above them. The purpose of having an edittext is to enable the user to enter their webite and by clicking on go-button, the entered website should be launched and I expect to see the toast I have inside public void onPageFinished(WebView view, String url) is fired again after the new website finishes loading. But what happens is, once the user enters a new website in the edittext field and immediately after they press go_button the toast fires before even the website is loaded and it fires once again after the same web site is finished loading. Actually, I expect the toast to be fired only after every website finishes loading, but what is happening with me is not like that. Please provide me with suggestions to prevent occurring such problem.

JavaCode:

OnClickListener btnGoListener = new OnClickListener() {

    @Override
    public void onClick(View v) {
        // TODO Auto-generated method stub
        webView00.loadUrl(etUrl.getText().toString());
    }
};
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    requestWindowFeature(Window.FEATURE_NO_TITLE);
    setContentView(R.layout.activity_web_page00);

    webView00 = (WebView) findViewById(R.id.webView00);
    btnGo = (Button) findViewById(R.id.go_btn);
    etUrl = (EditText) findViewById(R.id.url_edittext);

    webView00.getSettings().setJavaScriptEnabled(true);
    webView00.setWebViewClient(new myWebViewClient());
    webView00.setWebChromeClient(new myWebChromeClient());

    btnGo.setOnClickListener(btnGoListener);
    webView00.loadUrl("http://google.com");
}

public class myWebChromeClient extends WebChromeClient {

}

public class myWebViewClient extends WebViewClient {        
    @Override
    public void onPageFinished(WebView view, String url) {
        super.onPageFinished(view, url);
        Toast.makeText(getBaseContext(), "Loading Finished", Toast.LENGTH_LONG)
                       .show();
        }
    };

Upvotes: 2

Views: 4640

Answers (3)

Noel
Noel

Reputation: 3566

I noticed onPageFinished is sometimes called multiple times if the webview re-rendered a page that was already loaded. On the reload, the webview would first render about:blank and calls onPageFinished before loading the actual webpage and calling onPageFinished again. The sequence is:

  1. load www.google.com
  2. onPageFinished is called
  3. load 'www.google.com' again
  4. onPageFinished is called. The URL is about:blank
  5. onPageFinished is called. The URL is www.google.com

To get around this issue in step 4, you can check that the url parameter passed to onPageFinished is the one you care about:

    @Override
    protected void onCreate(Bundle savedInstanceState) {
       ...
    
        webView00.loadUrl(myWebPage);
    }

    
    public class myWebViewClient extends WebViewClient {        
        @Override
        public void onPageFinished(WebView view, String url) {
            super.onPageFinished(view, URL);
            if(url == myWebPage) {
                Toast.makeText(getBaseContext(), "Loading Finished", Toast.LENGTH_LONG)
                           .show();
            }
        };

Upvotes: -1

Andros
Andros

Reputation: 4069

From the documentation :

When onPageFinished() is called, the rendering picture may not be updated yet. 
To get the notification for the new Picture, use onNewPicture(WebView, Picture).

http://developer.android.com/reference/android/webkit/WebViewClient.html#onPageFinished(android.webkit.WebView, java.lang.String)

I suggest that you implement method onProgressChanged from WebChromeClient.

Documentation :

http://developer.android.com/reference/android/webkit/WebChromeClient.html#onProgressChanged(android.webkit.WebView, int)

Upvotes: 0

cYrixmorten
cYrixmorten

Reputation: 7108

Have not tried the Chrome client yet, so have commented that one out, perhaps you can change seamlessly between them.

Nevertheless, I would think something like this should work:

OnClickListener btnGoListener = new OnClickListener() {

    @Override
    public void onClick(View v) {
        // TODO Auto-generated method stub
        webView00.loadUrl(etUrl.getText().toString());
        webView00.setWebViewClient(new WebViewClient() {

            public void onPageFinished(WebView view, String url) {
                Toast.makeText(getBaseContext(), "Loading Finished 2", Toast.LENGTH_LONG)
                .show();
            }
        });
    }
};
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    requestWindowFeature(Window.FEATURE_NO_TITLE);
    setContentView(R.layout.activity_web_page00);

    webView00 = (WebView) findViewById(R.id.webView00);
    btnGo = (Button) findViewById(R.id.go_btn);
    etUrl = (EditText) findViewById(R.id.url_edittext);

    webView00.getSettings().setJavaScriptEnabled(true);

    btnGo.setOnClickListener(btnGoListener);
    webView00.loadUrl("http://google.com");

    //webView00.setWebViewClient(new myWebViewClient());
    //webView00.setWebChromeClient(new myWebChromeClient());
    webView00.setWebViewClient(new WebViewClient() {

        public void onPageFinished(WebView view, String url) {
            Toast.makeText(getBaseContext(), "Loading Finished 1", Toast.LENGTH_LONG)
            .show();
        }
    });
}

Upvotes: -1

Related Questions