JS和java代码相互调用的一个线程问题
2018-12-21 本文已影响0人
飞奔吧牛牛
网页调用java代码时,所调用的方法运行在子线程中。
网页代码
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>个人相册</title>
<style type="text/css">
button {width:300px; height:100px;}
</style>
<script>
function callJava() {
js.goBack();
}
</script>
</head>
<body>
<div></div>
<button onclick="callJava()" />
</body>
</html>
Java代码
js和java代码通过mWebView.addJavascriptInterface(new JsInte(this), "js");建立连接
接口类:
public class JsInte {
private Activity activity;
public JsInte(Activity activity) {
this.activity = activity;
}
//js调用java:js.goBack();
@JavascriptInterface
public void goBack() {
Log.e("goBack", Thread.currentThread().getName());
Log.e("goBack", "goBack");
activity.onBackPressed();
}
}
activity:
public class MainActivity extends AppCompatActivity {
private WebView mWebView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mWebView = ((WebView) findViewById(R.id.web_view));
WebSettings settings = mWebView.getSettings();
settings.setJavaScriptEnabled(true);
settings.setDomStorageEnabled(true);
mWebView.setWebViewClient(new WebViewClient() {
public boolean shouldOverrideUrlLoading(WebView view, String url) {
view.loadUrl(url);
return true;
}
});
mWebView.addJavascriptInterface(new JsInte(this), "js");
mWebView.loadUrl("file:///android_asset/a.html");
}
@Override
public void onBackPressed() {
if (mWebView.canGoBack()) {
mWebView.goBack();
} else {
super.onBackPressed();
}
}
}
目前位置,一切看起来都人畜无害是吧。但是就是调用不起来。
通过打印Log发现,代码只走到了这里。
@Override
public void onBackPressed() {
//代码只走到了这里,if else里面的逻辑都没走。
if (mWebView.canGoBack()) {
这个就奇怪了,不走if,肯定会走else啊,但是里面的逻辑都没走。
我突然想到是不是线程问题,于是,我这样打印
@Override
public void onBackPressed() {
Log.e("onBackPressed", Thread.currentThread().getName());
if (mWebView.canGoBack()) {
Log.e("canGoBack", Thread.currentThread().getName());
mWebView.goBack();
} else {
Log.e("super.onBackPressed", Thread.currentThread().getName());
MainActivity.super.onBackPressed();
}
}
打印结果:
12-21 10:39:20.454 8028-8288/com.app.jsjavademo E/onBackPressed: JavaBridge
果然,这个方法不是主线程!!!是一个叫JavaBridge的线程。
那只能让它在主线程中运行了
@Override
public void onBackPressed() {
runOnUiThread(new Runnable() {
@Override
public void run() {
if (mWebView.canGoBack()) {
mWebView.goBack();
} else {
MainActivity.super.onBackPressed();
}
}
});
}
到此,这个问题的原因算是出来了。js调用java代码,运行在一个子线程中。在此做个记录。