wake-up-neo.com

Legen Sie loadURLTImeOutValue in WebView fest

Ich arbeite mit PhoneGap und Android und habe meine HTML- und JS-Dateien auf einem externen Server. Wenn ich den folgenden Code verwende, lädt die App meine externen .html-Dateien und alles funktioniert einwandfrei:

this.setIntegerProperty("loadUrlTimeoutValue", 60000);
this.loadUrl("http://www.myserver.com");

Bei der Arbeit über eine WebView kann ich die loadURLTimeoutValue für eine WebView nicht einstellen

private WebView webView;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);  

try {
     webView = (WebView) findViewById(R.id.webview);    
     webView.setScrollBarStyle(View.SCROLLBARS_INSIDE_OVERLAY);
     webView.loadUrl("http://www.myserver.com");     
}

Das geht nicht. Wie kann ich den Timeout-Wert für WebView einstellen?

21
user989557

Dies ist eine Problemumgehung, um das beschriebene Verhalten zu simulieren. Sie können eine WebViewClient verwenden und die onPageStarted-Methode überschreiben:

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() {
                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;
    }
}

Bei Timeout können Sie zB eine Fehlerseite laden ...

Um WebViewClient zu Ihnen WebView hinzuzufügen, tun Sie dies einfach:

webView.setWebViewClient(new MyWebViewClient());
28
Vito Gentile

Ich habe hiermit eine Auszeit für mein WebView festgelegt:

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;
    }
}
14
Nick

Die korrekte Methode zum Ändern des Standardzeitlimits ist die Verwendung des Tags <preference /> in der Datei config.xml. Beispiel: 

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

Weitere Einstellungsmöglichkeiten finden Sie unter Android-Konfiguration .

6
shimatai
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;
    }
});
1
Alexander Savin

Wenn Sie CordovaWebView erweitern, was Sie benötigen, um die phonegap-API zu erhalten, können Sie einfach Folgendes verwenden:

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

Intern implementiert CordovaWebView einen Timeout-Mechanismus ähnlich dem im vorherigen Beitrag vorgeschlagenen (Standard-Timeout = 2000).

Beachten Sie, dass es sich hierbei nicht um eine dokumentierte Schnittstelle handelt, die möglicherweise in der Zukunft beschädigt wird.

1
bertvh

Die Verwendung der Thread-Klasse stört mich, wenn ich das WebView von der run-Funktion aus aufrufe. Dies führt zu einer Ausnahme, da das WebView erstellt und in einem anderen Thread verwendet wird eine AsyncTask, um eine Fehlerdatei in die WebView zu laden, wenn das Timeout erreicht wurde. Wenn die Seite ordnungsgemäß geladen wird, bricht ich die AsyncTask ab. __ Die Variable onPostExecute wird im UI-Thread ausgeführt.

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
Itamar Kerbel