Android WebView与js交互

js调用原生方法

设置WebView支持JavaScript

//设置WebView支持JavaScript
mWebView.getSettings().setJavaScriptEnabled(true);

在js中调用本地java方法

//在js中调用本地java方法 "jsApi"表示通过给js调用的对象名
mWebView.addJavascriptInterface(new JsInterface(this), "jsApi");

定义JsInterface

JsInterface中的方法与前端小伙伴一起定义

   private class JsInterface {
        private Context mContext;

        public JsInterface(Context context) {
            this.mContext = context;
        }

        //在js中调用window.jsApi.show(name),便会触发此方法。
        @JavascriptInterface
        public void show(String name) {
            Toast.makeText(mContext, name, Toast.LENGTH_SHORT).show();
        }
        //在js中调用window.jsApi.test(name),便会触发此方法,返回一个字符串。
        @JavascriptInterface
        public String test(String str){

            String bbb = "大哥你好";

            return bbb;
        }
        /**在js中调用window.jsApi.testCallback(fnName,prames),便会触发此方法。
        *prames为json字符串,通过Gson解析。
        *fnName为一个方法名,需要调用js中的方法
        */
        @JavascriptInterface
        public void testCallback(String fnName,String prames){

            JsonObject jsonObject = new JsonParser().parse(prames).getAsJsonObject();
            String name = jsonObject.get("name").getAsString();
            String age = jsonObject.get("age").getAsString();
            System.out.println(name+"++++++++++++++");
            System.out.println(age+"++++++++++++++");
            Map map = new HashMap();
            map.put("name","大哥");
            map.put("age","122");
            String jsonString = new Gson().toJson(map);
            mWebView.loadUrl("javascript:"+fnName+"('" + jsonString + "')");
        }
    }

原生调用js方法

在java中调用js方法

 //调用js中的函数:jsname(prames)
webView.loadUrl("javascript:jsname('" + prames + "')");

解决:Android出现All WebView methods must be called on the same thread.

新版的Android的SDK要求在创建WebView所在的线程中操作它,在其它线程中操作它都会报这个错误。

RefreshActivity.this.runOnUiThread(new Runnable() {
    @Override
    public void run() {
    //若是需要参数,则将参数定义为全局参数
        webview.loadUrl("http://www.lanhusoft.com");  
    }
});

RefreshActivity就是webview所在的Activity。

webview是通过webview = (WebView) findViewById(R.id.webViewName);获取到的对象实例。

你可能感兴趣的:(Android WebView与js交互)