zoukankan      html  css  js  c++  java
  • 安卓奇葩问题之:设置webView超时

    我只想说:what a fucking day!

    今天要做一个webView的超时功能,于是开始百度,一看貌似很简单啊,于是开始copy了下面的代码。

    import java.util.Timer;
    import java.util.TimerTask;
    
    import android.app.Activity;
    import android.graphics.Bitmap;
    import android.os.Bundle;
    import android.os.Handler;
    import android.os.Message;
    import android.util.Log;
    import android.view.Window;
    import android.webkit.WebSettings;
    import android.webkit.WebView;
    import android.webkit.WebViewClient;
    
    
    public class TestJsActivity extends Activity {
        private long timeout = 5000;
    
        private WebView mWebView;
    
        private Handler mHandler = new Handler();
    
        private Timer timer;
    
        @Override
        public void onCreate(Bundle icicle) {
            super.onCreate(icicle);
            requestWindowFeature(Window.FEATURE_NO_TITLE);
            setContentView(R.layout.main);
            mWebView = (WebView) findViewById(R.id.webview);
            WebSettings webSettings = mWebView.getSettings();
            webSettings.setJavaScriptEnabled(true);
            webSettings.setAllowFileAccess(true);
            mWebView.setWebViewClient(new WebViewClient() {
                /*
                 * 创建一个WebViewClient,重写onPageStarted和onPageFinished
                 * 
                 * 
                 * onPageStarted中启动一个计时器,到达设置时间后利用handle发送消息给activity执行超时后的动作.
                 * 
                 */
                @Override
                public void onPageStarted(WebView view, String url, Bitmap favicon) {
                    Log.d("testTimeout", "onPageStarted...........");
                    // TODO Auto-generated method stub
                    super.onPageStarted(view, url, favicon);
                    timer = new Timer();
                    TimerTask tt = new TimerTask() {
                        @Override
                        public void run() {
                            /*
                             * 超时后,首先判断页面加载进度,超时并且进度小于100,就执行超时后的动作
                             */
                            if (TestJsActivity.this.mWebView.getProgress() < 100) {
                                Log.d("testTimeout", "timeout...........");
                                Message msg = new Message();
                                msg.what = 1;
                                mHandler.sendMessage(msg);
                                timer.cancel();
                                timer.purge();
                            }
                        }
                    };
                    timer.schedule(tt, timeout, 1);
                }
    
                /**
                 * onPageFinished指页面加载完成,完成后取消计时器
                 */
                @Override
                public void onPageFinished(WebView view, String url) {
                    // TODO Auto-generated method stub
                    super.onPageFinished(view, url);
                    Log.d("testTimeout", "onPageFinished+++++++++++++++++++++++++");
                    Log.d("testTimeout", "+++++++++++++++++++++++++"
                            + TestJsActivity.this.mWebView.getProgress());
                    timer.cancel();
                    timer.purge();
                }
            });
            mWebView.loadUrl("http://image.baidu.com/i?ct=201326592&cl=2&nc=1&lm=-1&st=-1&tn=baiduimage&istype=2&fm=index&pv=&z=0&word=%D7%C0%C3%E6&s=0");
        }
    }

    下面,坑爹的就来了,运行发现报错:大概意思就是

    if (TestJsActivity.this.mWebView.getProgress() < 100)

    这行代码里的对webView的操作只能在同一个线程(犹豫其他需要,在主线程也对webView进行了操作),于是我就纠结了一天。

    后来发现由于webView控件的回调方法onPageFinished()的特点,根本不需要加上面那行代码
    oh,my god。知道真相的我眼泪掉下来啊。。。
  • 相关阅读:
    聊聊tcpdump与Wireshark抓包分析
    TCP三次握手与Tcpdump抓包分析过程
    grep 同时满足多个关键字和满足任意关键字
    java监听器原理理解与实现
    Linux下如何查看哪些端口处于监听状态
    netstat命令怎么查看端口是否占用
    jQuery Mobile 入门基础教程
    用U盘与移动硬盘制作WIN7启动盘(亲自实践)
    【iOS】用Layer创建一个三维模型以及拖动
    Java中的位运算符、移位运算
  • 原文地址:https://www.cnblogs.com/a446276468/p/5436330.html
Copyright © 2011-2022 走看看