Définir loadURLTImeOutValue sur WebView
je travaille avec PhoneGap et Android et j'ai mon .fichiers html et js sur un serveur externe. Lorsque j'utilise le code suivant, l'application mes charges externes .les fichiers html et tout fonctionne bien:
this.setIntegerProperty("loadUrlTimeoutValue", 60000);
this.loadUrl("http://www.myserver.com");
cependant, lorsque le travail via un WebView
je n'arrive pas à définir l' loadURLTimeoutValue
WebView
:
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");
}
Cela ne fonctionne pas. Comment puis-je définir la valeur de timeout sur le WebView
?
5 réponses
C'est une solution de contournement pour simuler le comportement décrit. Vous pouvez utiliser un WebViewClient
, et de remplacer les onPageStarted
méthode:
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;
}
}
si timeout, vous pouvez charger, par exemple, une page d'erreur...
ajouter WebViewClient
pour vous WebView
, il suffit de faire ceci:
webView.setWebViewClient(new MyWebViewClient());
j'ai utilisé cette fonction pour définir le temps de mon 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;
}
}
la bonne façon de changer le délai par défaut est d'utiliser tag <preference />
dans config.fichier xml, par exemple:
<preference name="loglevel" value="DEBUG" />
<preference name="loadUrlTimeoutValue" value="60000" />
<preference name="errorUrl" value="file:///android_asset/www/connection_error.html" />
pour plus d'options de préférence, reportez-vous à Configuration Android.
si vous prolongez CordovaWebView, ce que vous devriez faire pour obtenir l'API phonegap, vous pouvez utiliser ce qui suit:
this.getIntent().putExtra("loadUrlTimeoutValue", 60000);
en interne, CordovaWebView implémente un mécanisme de timeout similaire à ceux proposés dans le post précédent (timeout par défaut = 2000).
rappelez-vous qu'il ne s'agit pas d'une interface documentée, donc elle pourrait se casser dans le futur.
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;
}
});