安卓奇葩問題之:設置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。知道真相的我眼淚掉下來啊。。。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM