android4.1 JELLY_BEAN:All WebView methods must be called on the same thread[问题已解决]

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

今天群里的一个朋友进来问到此问题,我提示他:异常信息提示很明确,所有的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>

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

时间: 2024-10-16 23:45:36

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

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

问题 webView调用JS出错. class TestJS {         ......         public TestJS(){         }                  public void save(String data){                         webView.loadUrl("javascript: alert(" + data +")");         }         ......     

[WebView学习之四]:迁移到Android4.4版本的WebView

上一篇我们学习了([WebView学习之三]:使用WebView来创建Apps),今天我们来继续学习. (博客地址:http://blog.csdn.net/developer_jiangqq),转载请注明. Author:hmjiangqq Email:[email protected] Android4.4(API版本19)提供了一个基于Chromium版本的新版本WebView.该变化提高了WebView的性能,并且和最新的Web浏览器支持最新的HTML5,CSS3样式以及Javascri

[Phonegap+Sencha Touch] 移动开发16 安卓webview中,input输入框不触发backspace回退键事件的解决办法

可以用安卓手机浏览器打开 http://javascript.info/tutorial/keyboard-events#test-stand-test-stand 测试看看. Android 4.2自带浏览器和webview的测试结果(其他版本没试过,估计4.X都是这样): 当input有内容的时候,点击软键盘回退键(keyCode=8),是有keyEvents事件(keyup keydown)触发的:当input是空的时候,再点击,就不触发keyEvents了. Chrome浏览器测试结果:

webView.loadUrl 错误:A WebView method was called on thread &#39;JavaBridge&#39;.

String voicePath="file://"+MVOICEPATH; webView.loadUrl("javascript:voiceStopCallback('"+voicePath+"')"); 日志错误提示: A WebView method was called on thread 'JavaBridge'. All WebView methods must be called on the same thread 解决办法 w

webview加载页面为什么在UI线程里面做,难道不是耗时操作么

============问题描述============ 谁能告诉我 想不明白 ============解决方案1============ WebView 里面必须放在UI线程里面展示. private static void checkThread() { if (Looper.myLooper() != Looper.getMainLooper()) { Throwable throwable = new Throwable( "Warning: A WebView method was c

Android使用Webview显示页面以及点击跳转StartActivity问题

以下是个人拙见,大神可直接忽略. 直接奔入主题,android的一个webview控件相信大家都特别熟悉了,可以用来加载显示网页,像商城的商品图文详情就可以用网页很快实现,但是最近项目中遇到不一样的问题,商品首页用webview显示,点击某一个商品或者商品分类startactivity跳转自身的界面,首页混杂一部分网页加载肯定会遇到界面显示卡顿,显示慢的问题,不过既然需求是这样,也只能照做了. 显示一个网页就不说了,首先,先优化一下显示速度问题,也就是显示文字和图片的先后,在oncreate方法

Android WebView 4.0与4.4对JS的变化

ERROR:All WebView methods must be called on the same thread. warnning: 所有WebView方法必须在主线程调用(4.0) 所有WebView方法必须在同一线程调用(4.4) 这是原来报错的程序 public void loadurl(final WebView view, final String url) { new Thread() { public void run() { handler.sendEmptyMessag

【Android】java.lang.RuntimeException: java.lang.Throwable: A WebView method was called on thread &#39;JavaBridge&#39;.

一.问题 Java调用JS事件出现 java.lang.RuntimeException: 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) {3474c308} called on Looper (JavaBridg

Android - A WebView method was called on thread &#39;JavaBridge

源码: webView.evaluateJavascript("javascript:"+callBack + "(" + request + ")", new ValueCallback<String>() { @Override public void onReceiveValue(String value) { Log.d(TAG, "onReceiveValue: "+value+ pin); // Sof