在WebView上设置loadURLTImeOutValue

时间:2011-10-14 19:08:05

标签: android cordova android-webview

我正在使用PhoneGap和Android,并在外部服务器上安装我的.html和js文件。当我使用以下代码时,该应用程序加载我的外部.html文件,一切正常:

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

但是,通过WebView工作时,我似乎无法为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");     
}

这不起作用。如何在WebView上设置超时值?

6 个答案:

答案 0 :(得分:28)

这是一种模拟描述行为的解决方法。您可以使用WebViewClient,并覆盖onPageStarted方法:

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

如果超时,您可以加载例如错误页面......

要向WebViewClient添加WebView,请执行以下操作:

webView.setWebViewClient(new MyWebViewClient());

答案 1 :(得分:14)

我用它来为我的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;
    }
}

答案 2 :(得分:7)

更改默认超时的正确方法是在config.xml文件中使用标记<preference />,例如:

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

有关更多偏好选项,请参阅Android Configuration

答案 3 :(得分:1)

如果你扩展CordovaWebView,你应该使用它来获取phonegap API,你可以使用以下内容:

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

在内部,CordovaWebView实现了类似于上一篇文章中提出的超时机制(默认超时= 2000)。

请注意,这不是一个记录在案的界面,因此将来可能会中断。

答案 4 :(得分:1)

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

答案 5 :(得分:0)

使用Thread类困扰我,从run函数调用WebView会导致异常,因为该WebView是在另一个线程中创建和使用的。 我将使用AsyncTask执行此操作。 在此示例中,如果超时,我将使用AsyncTask将错误文件加载到WebView中。如果页面正确加载,则取消AsyncTask。 onPostExecute在UI线程中运行,因此与WebView交互时没有线程安全问题:

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