Android Webview 超时问题

4
有没有办法在WebView中设置超时时间?如果URL响应太慢或者网站在10秒内无法加载,我希望WebView能自动超时。
我不知道从哪里开始 :(
我有两个类,第一个是启动器,第二个是用于webView的类。 启动器是一个线程和一个启动屏幕,下一个活动是主webView,因此,如果网站在4-10秒内没有响应,我想添加一个检查程序,它将会显示错误信息。
我希望你们中的任何一个人能够帮助我,
3个回答

3

您可以通过设置定时器来检查当前页面的进度,调用getProgress()方法并且如果在一段特定时间后它小于某个阈值,那么您可以取消加载当前页面。


你能帮我更多地解决问题吗?你有一些我可以参考的例子吗? - Tirolel
一个实现相同功能的例子会帮助我们更好地学习,而简单的复制粘贴则无法达到这个目的。请参考此链接:https://dev59.com/P2855IYBdhLWcg3wg0nC#4303028。 - Darpan

2

以下是实现一个计时器的代码,它会检查页面加载进度,并在加载时间超过一定时间后触发相应的操作。

webView.setWebChromeClient(new WebChromeClient() {
    Long seconds = (long) 0.0;
    public void onProgressChanged(WebView view, int progress) {
        Date interestingDate = new Date();

        // second < 5 here you can use your desired time you wish to wait for.
        while (progress < 100 && seconds < 5) {
            //following line calculates time difference
            //between current time and time when page started loading.
            seconds = ((new Date()).getTime() - interestingDate.getTime())/1000;
        }

        if(progress < 100 && seconds > 5) {
            view.stopLoading();
            Log.d("###", "stopped");
        }       
    }
});

抱歉,我的编辑匆忙,现在无法撤回。但请告诉我您指的是哪个秒数以及如何编译它。 - Marvin Emil Brach
抱歉,我没有理解你的问题,请你能否解释一下? - Darpan
你写了 Seconds=(Long)0; - 我不知道那个类型,只知道枚举 TimeUnit,所以我匆忙地编辑了你的帖子并加上了那个 TimeUnit。然后是贴代码的时间,但我遇到了一个问题: TimeUnit.Seconds=(Long)0;Seconds=(Long)0; 都不在语法上正确,无法编译。至少在使用普通 ADT 库和 JDK 1.6 的 Eclipse Juno 中是如此。但每当我能学到新东西时,我都很高兴,所以我试图弄清楚在哪些条件下你可以编译它(如果你可以的话)。无论如何,感谢你的时间 ;) - Marvin Emil Brach

1
Darpans的代码将无法工作,至少因为参数progress在while期间不会改变,只能在下一次调用时改变。请尝试使用以下代码替代:
private long starttime = 0;
public void onProgressChanged(WebView view, int progress) {
    Log.v(TAG, "progressChanged: " + progress);
    if(progress == 10) starttime = System.currentTimeMillis();

    long secondsSinceStart = (System.currentTimeMillis() - starttime) / 1000;

    if(progress < 100) {
        Log.v(TAG, "seconds since start: " + secondsSinceStart);
        if(secondsSinceStart > 5){
            view.stopLoading();
            Log.d(TAG, "TIMEOUT -> Stopped.");
        }
    } else {
        Log.v(TAG, progress + "% completed in: " + secondsSinceStart + " seconds");
    }
}

很遗憾,只有在与服务器的连接建立时才能正常工作。如果没有连接,onProgressChanged 只会在加载被中止时的10%和100%时调用两次。


你是对的,它不会起作用。得把“while”改成“if”。 - Darpan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接