11-06 18:29:15.582: W/WebView(27807): java.lang.Throwable: A WebView method was called on thread 'JavaBridge'. All WebView methods must be called on the same thread. (Expected Looper Looper (main, tid 1) {425f48a8} called on Looper (JavaBridge, tid 92104) {426508d0}, FYI main Looper is Looper (main, tid 1) {425f48a8})

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvY2hhbmdlbXlzZWxm/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" />

今天群里的一个朋友进来问到此问题。我提示他:异常信息提示非常明白,全部的webview的方法比调用必须在一个线程,2个方法调用tid明显不同嘛。

我们先看他写得代码:

package com.webview;

import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
import android.webkit.JavascriptInterface;
import android.webkit.WebView; public class MainActivity extends Activity {
private Handler handler= new Handler();
private WebView webView; @SuppressLint("NewApi")
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); webView = (WebView) findViewById(R.id.webView); // 依据ID找到WebView
webView.getSettings().setJavaScriptEnabled(true); // 同意JS
webView.loadUrl("file:///android_asset/index.html"); // 载入页面
webView.addJavascriptInterface(new Contact(), "contact"); // 创建Contact对象, 传给WebView, 作为JS对象 } class Contact {
@JavascriptInterface
public void showContacts() {
/* handler.post(new Runnable(){
@Override
public void run(){
String json = "[{name:\"王小二\", amount:\"12345\", phone:\"18600012345\"}, {name:\"黎明\", amount:\"54321\", phone:\"18600054321\"}]";
webView.loadUrl("javascript:show('" + json + "')"); // 调用JS方法// 把js数据,传递给html页面
}
});*/ String json = "[{name:\"王小二\", amount:\"12345\", phone:\"18600012345\"}, {name:\"黎明\", amount:\"54321\", phone:\"18600054321\"}]";
webView.loadUrl("javascript:show('" + json + "')"); // 调用JS方法// 把js数据,传递给html页面 }
@JavascriptInterface
public void call(final String phone) { /* handler.post(new Runnable() {
@Override
public void run(){
startActivity(new Intent(Intent.ACTION_CALL, Uri.parse("tel://" + phone)));
}
});*/ startActivity(new Intent(Intent.ACTION_CALL, Uri.parse("tel://" + phone)));
}
} }

上面代码事实上在android4.4下面版本号也不会出什么问题,曾经我也这么写过。可是 Android 4.1,API 17,也就是JELLY_BEAN 開始,android就针对webview中运行js代码和原生代码之间交互做了一些修改,详细修改什么我也没有去研究。仅仅是把按照异常信息给出解决方法而已。

上述代码。仅仅要把js调用的方法  call()和 showContacts()都放在同一个handler.post线程运行就没有问题了。

此外。仅仅有被JavascriptInterface 注解标识的公有方法能够被JS代码訪问,大家一定记住这一点

@JavascriptInterface
public void showContacts() {

假设在android4.1以上版本号。你提供给js调用的方法,没有标示注解。这种方法是无法被webview里的javascript訪问到的,非常多人也问到这个问题了。

看看终于运行效果:

assets文件夹下的index.html代码:

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
<script type="text/javascript">
function show(jsondata) {
var jsonobjs = eval(jsondata); // 生成json数组
var table = document.getElementById("personTable");
for ( var y = 0; y < jsonobjs.length; y++) { // 遍历json数组
var tr = table.insertRow(table.rows.length); // 每一个对象创建1个TR
var td1 = tr.insertCell(0); // 创建3个TD
var td2 = tr.insertCell(1);
var td3 = tr.insertCell(2);
td1.innerHTML = jsonobjs[y].name; // 设置TD的内容为json对象的name属性
td2.innerHTML = jsonobjs[y].amount;
td3.innerHTML = "<a href='javascript:contact.call(\"" + jsonobjs[y].phone + "\")'>" + jsonobjs[y].phone + "</a>"; // 点击超链接时运行Java方法
}
}
</script>
</head>
<body onLoad="javascript:contact.showContacts()">
<table width="100%" id="personTable">
<tr>
<td width="30%">姓名</td>
<td width="30%" align="center">存款</td>
<td align="center">电话</td>
</tr>
</table>
</body>
</html>

源码下载:(有人须要我就上传)

  • 欢迎增加CSDN技术群:221057495 交流

android4.1 JELLY_BEAN:All WebView methods must be called on the same thread[问题已解决]的更多相关文章

  1. [原][Android]All WebView methods must be called on the same thread.

    问题 webView调用JS出错. class TestJS {         ......         public TestJS(){         }                   ...

  2. Android webview通过http get下载文件下载两次的问题及解决方法

    一.现象 一般通过Android webview进行下载文件的方法是 1.重写DownloadListener的onDownloadStart方法,在onDownloadStart方法中弹出对话框提示 ...

  3. Android WebView组件 访问部分网页崩溃问题【已解决】

    最近刚接触Android,在测试WebView组件时发现总是出现崩溃现像: 提示:ERR_CLEARTEXT_NOT_PERMITTED 当时以为是权限问题,查找自己的AndroidManifest文 ...

  4. Android WebView 总结 —— Java和JavaScript交互

    交互如何实现 实现Java和js交互十分便捷.通常只需要以下几步. WebView开启JavaScript脚本执行 WebView设置供JavaScript调用的交互接口. 客户端和网页端编写调用对方 ...

  5. android 平台 java和javascript 通信问题 A WebView method was called on thread 'JavaBridge'.

      java.lang.RuntimeException: java.lang.Throwable: A WebView method was called on thread 'JavaBridge ...

  6. webView.loadUrl 错误:A WebView method was called on thread 'JavaBridge'.

    String voicePath="file://"+MVOICEPATH; webView.loadUrl("javascript:voiceStopCallback( ...

  7. WebView上实现Java与JavaScript交互

    在安卓开发上,考虑到开发效率和界面更新,有时使用WebView结合web页面技术,可以快速迭代地开发移动应用.WebView加载资源的速度并不慢,但是如果资源多了,就很慢.图片.css.js.html ...

  8. Android-Throwable: A WebView method was called on thread 'JavaBridge'.

    错误详情: 01-30 03:36:52.441 12000-12048/cn.h5 D/@@@: e.ttt:java.lang.RuntimeException: java.lang.Throwa ...

  9. 【Android】java.lang.RuntimeException: java.lang.Throwable: A WebView method was called on thread 'JavaBridge'.

    一.问题 Java调用JS事件出现 java.lang.RuntimeException: java.lang.Throwable: A WebView method was called on th ...

随机推荐

  1. WPS2019体验

    不久之前WPS2019发布了, 说实话, 做的真的不错. 没找到2016版本多得吓人的广告, 没有那糟糕的页面设计, 没有那卡顿的体验. 而且不同的程序(文字, 演示)做成了类似标签页的形式, 体验比 ...

  2. 邂逅Sass和Compass之Sass篇

    对于一个从后台转到前端的web开发者来说,最大的麻烦就是写CSS,了解CSS的人都知道,它可以开发网页样式,但是没法用它编程,感觉耦合性相当的高,如果想要方便以后维护,只能逐句修改甚至重写相当一部分的 ...

  3. NOI2014 魔法森林 day1t2 SPFA

    这道题做法还是很多的,至少有人用最优性剪枝当场A掉了.我只有50分的暴力分(写丑了),SB我不会LCT,先写一下SPFA的神思路做法(说白了还是我SB),LCT以后定补.ORZ想出来的人(hq大神). ...

  4. AC日记——Sagheer and Crossroads codeforces 812a

    812A - Sagheer and Crossroads 思路: 模拟: 代码: #include <cstdio> #include <cstring> #include ...

  5. #pragma once 与 #ifndef

    #pragma once:保证头文件只被编译一次.这种方式,是微软编译器独有的,也是后来才有的,所以知道的人并不是很多,用的人也不是很多,因为他不支持跨平台.如果你想写跨平台的代码,最好使用上一种.这 ...

  6. CentOS7单机部署lamp环境和apache虚拟主机

    (1)apache介绍 apache : httpd.apache.org 软件包:httpd 端口服务:80/tcp(http) 443/tcp(https,http+ssl) 配置文件: /etc ...

  7. Python与SQLite日期时间函数的使法

    SQLite的时间函数跟Python的时间函数有些许差别,所以稍做记录,供自己以后查询. 网上有将SQLite官方WIKI内容翻译成中文的文章,大家有兴趣可以搜索一下,我这里单纯记录一下个人比较常用的 ...

  8. 字符串hash-RK算法讲解二

    算法分析:预处理时间Θ(m),即求h,p,t的时间为,匹配时间在最坏情况下为Θ((n-m-1)m),因为可能出现每次都是可能命中点的情况.如T=a^n,P=a^m,此种情况下验证时间为Θ((n-m-1 ...

  9. CodeForces 740D Alyona and a tree

    倍增,延迟标记. 考虑一个$u$给他的哪几个祖先$v$贡献了$1$.越往上$dis(v,u)$越大,找到最远的一个还满足条件的$v$,$v$到$u$的父亲这条链上的答案都$+1$.延迟标记一下,然后从 ...

  10. Jenkins实现CI(Continuous Integration)到CD(Continuous Delivery)

    Pipeline as Code是2.0的精髓所在,是帮助Jenkins实现CI(Continuous Integration)到CD(Continuous Delivery)华丽转身的关键推手.所谓 ...