10

我的问题与这个家伙不同。我的进度对话框在页面加载开始时开始,在页面加载在我的 web 视图中完成时结束。我的问题是进度对话框开始并且永远不会被解雇。我设置了断点,它显示进度对话框开始并被解雇很多次然后它开始并且即使在页面加载完成后也不会被解雇。我的问题是为什么 onPageStarted 多次执行单个页面加载?为什么在页面加载完成后不调用 onPageFinished?

       myWebView.setWebViewClient(new WebViewClient(){
        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url) {
            myWebView.loadUrl(url);
            return true;
        }

        @Override
        public void onPageStarted(WebView view, String url, Bitmap favicon) {
            super.onPageStarted(myWebView, url, favicon);
            Log.d("mytag","Page Loading Started");
            //myURLProgressDialog= ProgressDialog.show(WebviewExampleActivity.this, "Page Loading", "Wait for a moment...");
        }
        @Override
        public void onPageFinished(WebView view, String url) {
            Log.d("mytag","Page Loading Finished!");
            super.onPageFinished(myWebView, url);
            //myURLProgressDialog.dismiss();
        }

    });

我的自我标记过滤日志是这样加载单页的:

   10-06 10:32:49.298: DEBUG/mytag(508): Page Loading Started
   10-06 10:32:49.998: DEBUG/mytag(508): Page Loading Started
   10-06 10:32:50.048: DEBUG/mytag(508): Page Loading Finished!
   10-06 10:32:50.048: DEBUG/mytag(508): Page Loading Started
   10-06 10:33:00.898: DEBUG/mytag(508): Page Loading Finished!

当我单击已加载页面上的链接时,它工作正常。这是日志:

10-06 10:59:25.098: DEBUG/mytag(543): Page Loading Started
10-06 10:59:30.889: DEBUG/mytag(543): Page Loading Finished!
4

5 回答 5

6

检查它是否已经用.isShowing().

final ProgressDialog mProgressDialog = new ProgressDialog(this);
mProgressDialog.setMessage("Loading...");

browser.setWebViewClient(new myViewClient(){

    @Override  
    public void onPageStarted(WebView view, String url, Bitmap favicon) {
        super.onPageStarted(view, url, favicon);

        if(!mProgressDialog.isShowing())
        {
            mProgressDialog.show();
        }

    }  
    @Override  
    public void onPageFinished(WebView view, String url) {
        super.onPageFinished(view, url);

        if(mProgressDialog.isShowing()){
            mProgressDialog.dismiss();
        }                
    }              

});
于 2012-11-11T21:16:06.010 回答
5

如果您在正在加载的页面中有 ajax 调用,则仅当这些调用完成时才会调用 onPageFinished()。最好使用 window.setTimeout() 进行这些调用。在这种情况下,UI 线程不会在这些调用上被阻塞,并且 onPageFinished() 将在主页加载后立即调用。

于 2012-02-23T10:37:38.077 回答
0

有时会发生这样的情况,当初始页面加载时,某些脚本会进行重定向(因为它需要一个会话 ID,或者会使页面再次加载的东西)。

您可以通过记录 url 参数来检查是否正在加载不同的页面(或具有附加参数的相同页面)。

我猜如果在第一页完成加载之前发出新的加载请求,则不会为该第一页调用 OnPageFinished 方法。

于 2012-05-28T15:11:13.753 回答
0

这是一个解决方案。我没有使用加载对话框,而是使用另一个 webview 作为启动屏幕,但您可以轻松更改它。

诀窍是,查看“onpagefinished”之后是否有新的“onpagestart”。如果是这种情况,请不要关闭加载并等待下一个“onpagefinished”。

myWebView.setWebViewClient(new WebViewClient() {
    boolean loadingFinished = true;
    boolean redirect = false;

    long last_page_start;
    long now;

    // Load the url
    public boolean shouldOverrideUrlLoading(WebView view, String url) {
        if (!loadingFinished) {
            redirect = true;
        }

        loadingFinished = false;
        view.loadUrl(url);
        return false;
    }

    @Override
    public void onPageStarted(WebView view, String url, Bitmap favicon) {
        Log.i("p","pagestart");
        loadingFinished = false;
        last_page_start = System.nanoTime();
        show_splash();
    }

    // When finish loading page
    public void onPageFinished(WebView view, String url) {
        Log.i("p","pagefinish");
        if(!redirect){
            loadingFinished = true;
        }
        //call remove_splash in 500 miSec
        if(loadingFinished && !redirect){
            now = System.nanoTime();
            new android.os.Handler().postDelayed(
                    new Runnable() {
                        public void run() {
                            remove_splash();
                        }
                    },
                    500);
        } else{
            redirect = false;
        }
    }
    private void show_splash() {
        if(myWebView.getVisibility() == View.VISIBLE) {
            myWebView.setVisibility(View.GONE);
            myWebView_splash.setVisibility(View.VISIBLE);
        }
    }
    //if a new "page start" was fired dont remove splash screen
    private void remove_splash() {
        if (last_page_start < now) {
            myWebView.setVisibility(View.VISIBLE);
            myWebView_splash.setVisibility(View.GONE);
        }
    }

});
于 2015-05-19T19:10:46.213 回答
0

当在 webview 应用程序上提交页面时:onPageStarted Fired,但 onPageFinished not Fired 所以请遵循以下固定且完全正确的代码

    ProgressDialog pd = null;

    @Override
    public void onPageStarted(WebView view, String url, Bitmap favicon) {
        super.onPageStarted(view, url, favicon);
        if(pd == null || !pd.isShowing()) {
            pd = new ProgressDialog(MainActivity.this);
            pd.setTitle("Please wait");
            pd.setMessage("App is loading...");
            pd.show();
        }
    }

    @Override
    public void onPageFinished(WebView view, String url) {
        super.onPageFinished(view, url);
        if (pd != null) {
            pd.dismiss();
        }
    }
于 2017-01-17T15:32:57.543 回答