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?
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());
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;
}
}
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 .
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;
}
});
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.
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");
}
}
}