Set loadURLTImeOutValue on WebView

前端 未结 6 1097
我在风中等你
我在风中等你 2020-11-29 06:32

I\'m working with PhoneGap and Android and have my .html and js files on an external server. When I use the following code, the app loads my external .html files and everyt

相关标签:
6条回答
  • 2020-11-29 06:58

    I used this to set a time out for my WebView:

    public class MyWebViewClient extends WebViewClient {
    
        boolean timeout = true;
    
        @Override
        public void onPageStarted(WebView view, String url, Bitmap favicon) {
            Runnable run = new Runnable() {
                public void run() {
                    if(timeout) {
                        // do what you want
                        showAlert("Connection Timed out", "Whoops! Something went wrong. Please try again later.");
                    }
                }
            };
            Handler myHandler = new Handler(Looper.myLooper());
            myHandler.postDelayed(run, 5000);
        }
    
        @Override
        public void onPageFinished(WebView view, String url) {
            timeout = false;
        }
    }
    
    0 讨论(0)
  • 2020-11-29 07:01

    This is a workaround to simulate the described behavior. You can use a WebViewClient, and override the onPageStarted method:

    public class MyWebViewClient extends WebViewClient {
        boolean timeout;
    
        public MyWebViewClient() {
            timeout = true;
        }
    
        @Override
        public void onPageStarted(WebView view, String url, Bitmap favicon) {
            new Thread(new Runnable() {
                @Override
                public void run() {
                    timeout = true;
    
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    if(timeout) {
                        // do what you want
                    }
                }
            }).start();
        }
    
        @Override
        public void onPageFinished(WebView view, String url) {
            timeout = false;
        }
    }
    

    If timeout, you can load, for example, an error page...

    To add the WebViewClient to you WebView, just do this:

    webView.setWebViewClient(new MyWebViewClient());
    
    0 讨论(0)
  • 2020-11-29 07:09

    If you extend CordovaWebView, which you should in order to get the phonegap API, you can just use the following:

    this.getIntent().putExtra("loadUrlTimeoutValue", 60000);
    

    Internally, CordovaWebView implements a timeout mechanism similar to the ones proposed in the previous post (default timeout = 2000).

    Mind that this is not a documented interface, so it might break in the future.

    0 讨论(0)
  • 2020-11-29 07:10

    The correct way to change the default timeout is using tag <preference /> in config.xml file, for example:

    <preference name="loglevel" value="DEBUG" />
    <preference name="loadUrlTimeoutValue" value="60000" />
    <preference name="errorUrl" value="file:///android_asset/www/connection_error.html" />
    

    For more preference options, refer to Android Configuration.

    0 讨论(0)
  • 2020-11-29 07:17
    WebView mWebView = findViewById(R.id.web_view);
    mWebView.setWebViewClient(new WebViewClient() {
        private volatile boolean timeout;
        private volatile String timeoutOnPageStartedURL;
        private volatile String timeoutCurrentURL;
    
        @Override
        public void onPageStarted(WebView view, String url, Bitmap favicon) {
            super.onPageStarted(view, url, favicon);
    
            timeout = true;
            timeoutOnPageStartedURL = url;
            timeoutCurrentURL = view.getUrl();
    
            new Thread(new Runnable() {
                @Override
                public void run() {
                    try {
                        Thread.sleep(5000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    if (timeout) {
                        view.post(new Runnable() {
                            @Override
                            public void run() {
                                String currentURL = view.getUrl();
                                if ((timeoutOnPageStartedURL.hashCode() == currentURL.hashCode()) ||
                                    (timeoutCurrentURL.hashCode() == currentURL.hashCode())) {
                                    // do what you want with UI   
                                }                                     
                            }
                        });
                    }
                }
            }).start();
        }
    
        @Override
        public void onPageFinished(WebView view, String url) {
            super.onPageFinished(view, url);
    
            timeout = false;
        }
    });
    
    0 讨论(0)
  • 2020-11-29 07:20

    The use of Thread class bothers me calling the WebView from the run function will lead to an exception as the WebView is created and used in another thread. I would perform this with an AsyncTask. In this example, I use an AsyncTask to load an error file into the WebView if the timeout was reached. If the page loads properly I cancel the AsyncTask. The onPostExecute runs in the UI thread so there is no thread safety problem to interact with the WebView:

    private class CustomWebViewClient extends WebViewClient {
        boolean mPageLoaded;
        final int mTimeoutLength = 20000;
        WebView mView;
        TimeoutCheck timeoutCheckTask;
    
        public CustomWebViewClient()
        {
            super();
            mPageLoaded = false;
        }
    
        @Override
        public void onPageStarted(WebView view, String url, Bitmap favicon) {
            mView = view;
    
            timeoutCheckTask  = new TimeoutCheck();
            timeoutCheckTask.execute(null,null);
        }
    
        public void onPageFinished(WebView view, String url) {
            mPageLoaded = true;
            timeoutCheckTask.cancel(true);
        }
    
        private class TimeoutCheck extends AsyncTask<Void, Void, Void> {
            protected Void doInBackground(Void... params) {
                long count = 0;
                while (count < mTimeoutLength)
                {
                    try
                    {
                        Thread.sleep( 1000 );
                    }
                    catch ( InterruptedException e )
                    {
                        e.printStackTrace();
                    }
    
                    // Escape early if cancel() is called
                    if (isCancelled()) break;
                    count += 1000;
                }
                return null;
            }
    
            protected void onPostExecute(Void result) {
                if(!mPageLoaded) {
                    mbLoadedErrFile = true;
                    //load error file into the webview
                    mView.loadUrl("file:///android_asset/url_err_timeout.html");
                }
            }
        }
    
    0 讨论(0)
提交回复
热议问题