android - Android 上的 WebView 问题

标签 android webview

我使用下面的代码通过 WebView 读取 .html 文件,
并打开与其他浏览器应用程序的超链接。

webView = (WebView)findViewById(R.id.terms_of_services_webview);
String Path = "...";  //html file path
WebSettings websettings = webView.getSettings();  
websettings.setSupportZoom(true);  
websettings.setBuiltInZoomControls(true);   
websettings.setJavaScriptEnabled(true);  
webView.setWebViewClient(new WebViewClient() {
    @Override
    public boolean shouldOverrideUrlLoading(WebView view, String url) {
        if(url.equals(Path)) {
            view.loadUrl(url);
        }
        else {
            Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
            TermsOfServicesActivity.this.startActivity(intent);
        }
        return true;  
    }
});

webView.loadUrl(Path);  

代码都在onCreate方法中。

但我在 Galaxy Tab 8.9(Android 4.0.4) 上找到了错误代码:

11-20 16:24:49.613: W/webview(25896): java.lang.Throwable: Warning: A WebView method was called on thread 'WebViewCoreThread'. All WebView methods must be called on the UI thread. Future versions of WebView may not support use on other threads.
11-20 16:24:49.613: W/webview(25896):   at android.webkit.WebView.checkThread(WebView.java:14240)
11-20 16:24:49.613: W/webview(25896):   at android.webkit.WebView.getSettings(WebView.java:5374)
11-20 16:24:49.613: W/webview(25896):   at android.webkit.WebView.getVisibleTitleHeightImpl(WebView.java:2340)
11-20 16:24:49.613: W/webview(25896):   at android.webkit.WebView.getViewHeight(WebView.java:2382)
11-20 16:24:49.613: W/webview(25896):   at android.webkit.WebViewCore.setupViewport(WebViewCore.java:3421)
11-20 16:24:49.613: W/webview(25896):   at android.webkit.WebViewCore.didFirstLayout(WebViewCore.java:3148)
11-20 16:24:49.613: W/webview(25896):   at android.webkit.JWebCoreJavaBridge.nativeServiceFuncPtrQueue(Native Method)
11-20 16:24:49.613: W/webview(25896):   at android.webkit.JWebCoreJavaBridge.handleMessage(JWebCoreJavaBridge.java:113)
11-20 16:24:49.613: W/webview(25896):   at android.os.Handler.dispatchMessage(Handler.java:99)
11-20 16:24:49.613: W/webview(25896):   at android.os.Looper.loop(Looper.java:137)
11-20 16:24:49.613: W/webview(25896):   at android.webkit.WebViewCore$WebCoreThread.run(WebViewCore.java:828)
11-20 16:24:49.613: W/webview(25896):   at java.lang.Thread.run(Thread.java:856)
11-20 16:24:49.623: E/StrictMode(25896): null
11-20 16:24:49.623: E/StrictMode(25896): java.lang.Throwable: Warning: A WebView method was called on thread 'WebViewCoreThread'. All WebView methods must be called on the UI thread. Future versions of WebView may not support use on other threads.
11-20 16:24:49.623: E/StrictMode(25896):    at android.webkit.WebView.checkThread(WebView.java:14240)
11-20 16:24:49.623: E/StrictMode(25896):    at android.webkit.WebView.getSettings(WebView.java:5374)
11-20 16:24:49.623: E/StrictMode(25896):    at android.webkit.WebView.getVisibleTitleHeightImpl(WebView.java:2340)
11-20 16:24:49.623: E/StrictMode(25896):    at android.webkit.WebView.getViewHeight(WebView.java:2382)
11-20 16:24:49.623: E/StrictMode(25896):    at android.webkit.WebViewCore.setupViewport(WebViewCore.java:3421)
11-20 16:24:49.623: E/StrictMode(25896):    at android.webkit.WebViewCore.didFirstLayout(WebViewCore.java:3148)
11-20 16:24:49.623: E/StrictMode(25896):    at android.webkit.JWebCoreJavaBridge.nativeServiceFuncPtrQueue(Native Method)
11-20 16:24:49.623: E/StrictMode(25896):    at android.webkit.JWebCoreJavaBridge.handleMessage(JWebCoreJavaBridge.java:113)
11-20 16:24:49.623: E/StrictMode(25896):    at android.os.Handler.dispatchMessage(Handler.java:99)
11-20 16:24:49.623: E/StrictMode(25896):    at android.os.Looper.loop(Looper.java:137)
11-20 16:24:49.623: E/StrictMode(25896):    at android.webkit.WebViewCore$WebCoreThread.run(WebViewCore.java:828)
11-20 16:24:49.623: E/StrictMode(25896):    at java.lang.Thread.run(Thread.java:856)

但它适用于 Xperia z11(Android 4.2.2)Nexus 7 2013(Android 4.3.1)ASUS TF201(Android 4.1.1) ).

为什么它不能在 4.0.3 上运行?
我怎样才能避免它?

最佳答案

正如警告所说,您正在调用 WebViewCoreThread 中的 webview 方法。因此像这样修改你的代码,

YourActivity.this.runOnUiThread(new Runnable() {
    public void run() {
       websettings.setSupportZoom(true);  
       websettings.setBuiltInZoomControls(true);   
       websettings.setJavaScriptEnabled(true);  
   webView.setWebViewClient(new WebViewClient() {
  @Override
  public boolean shouldOverrideUrlLoading(WebView view, String url) {
    if(url.equals(Path)) {
        view.loadUrl(url);
    }
    else {
        Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
        TermsOfServicesActivity.this.startActivity(intent);
    }
    return true;  
     }
 });

  webView.loadUrl(Path);  
     }
});

尝试在 setContentView() 之前的 onCreate() 方法中写入以下行。

  StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
    StrictMode.setThreadPolicy(policy);

关于android - Android 上的 WebView 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20091152/

相关文章:

android - 错误/Web 控制台 : Uncaught Error: Too much time spent in unload handler

android - 如何使用安卓ViewPager?

未授予 Android 权限

java - 如何让 Parse.com 推送通知在 Cordova/Phonegap Android 应用程序中工作?

java - 无法解码流 java.io.FileNotFoundException/storage/emulated/0

android - 如何使Android应用程序屏幕全屏显示?

Android - mainThread 处理程序会导致内存泄漏吗?

android - 在牛轧糖的 webview 中导航基于 Assets 的 html 文件

android - Android WebView onPageStarted/onPageFinished 方法详解

ios - 从 webview Controller xcode 打开 Whatsapp