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' loadURLTimeoutValueWebView:

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?

20
demandé sur Paul Chu 2011-10-14 23:08:04

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());
27
répondu Vito Gentile 2014-07-17 13:18:37

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;
    }
}
13
répondu Nick 2017-08-23 15:34:06

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.

6
répondu shimatai 2014-03-24 20:55:11

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.

1
répondu bertvh 2012-11-09 14:42:50
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
répondu Alexander Savin 2018-04-08 15:32:40