美文网首页
JS和java代码相互调用的一个线程问题

JS和java代码相互调用的一个线程问题

作者: 飞奔吧牛牛 | 来源:发表于2018-12-21 10:42 被阅读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代码,运行在一个子线程中。在此做个记录。

相关文章

网友评论

      本文标题:JS和java代码相互调用的一个线程问题

      本文链接:https://www.haomeiwen.com/subject/jizpkqtx.html