Android使用javascriptInterface从JavaScript调用Android功能

时间:2014-04-29 22:43:47

标签: android android-webview

我尝试从html文件中调用java函数,但我不能 我试图在我的javascriptInterface类上添加一个线程但是应用程序崩溃了。 (nullPointer)
据我所知,当javascript调用java函数时,它不会在同一个线程上运行。

如何进行javascript和java之间的通信?
即使在javascriptInterface上也无法做任何事情。即使它在javascriptInterface

上,我也无法调用函数

这是我的代码:

javascriptInterface.java

public class javascriptInterface {  
    Context mContext;
    WebView webView;

    javascriptInterface(Context c) {
        mContext = c;
    }

    @JavascriptInterface
    public void getTextMenuBarJS(String text){ 
        webView.getTextMenuBar(i,text);
    }
}

webview.java

公共类WebView扩展了Activity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_webview);
    webViewContent.setWebChromeClient(new WebChromeClient(){}); 

    webViewContent.loadUrl(JsonParsing.jsonObjectMap.get("path"));


    webViewContent.addJavascriptInterface(new javascriptInterface(this), "Android");

    btnSimple = (Button)this.findViewById(R.id.btnSimple);
    btnSimple.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            webView.loadUrl("" +
                    "javascript:" +
                    "(function() {" +
                    "var NumberChildrenMenuBar = document.getElementById('menubar').childElementCount;"+
                    "var menubar = document.getElementById('menubar');"+
                    "var MenuHTMLContent;"+
                    "for(var i=0; i<NumberChildrenMenuBar;i++){MenuHTMLContent = menubar.children[i].outerHTML; window.Android.getHTMLMenuBarJS(i,MenuHTMLContent);}"+

                    "})();"); 
               }
            });
       }

       public void getTextMenuBar(final int i,final String text){   
             runOnUiThread(new Runnable() {
                 public void run() { 
                     //load a function
                 }
             });
        }

这是我一直有的错误:

04-29 15:25:02.030: E/AndroidRuntime(27323): FATAL EXCEPTION: main

04-29 15:25:02.030: E/AndroidRuntime(27323): java.lang.NullPointerException
04-29 15:25:02.030: E/AndroidRuntime(27323):    at com. ... . ... .javascriptInterface$2.run(javascriptInterface.java:44)
04-29 15:25:02.030: E/AndroidRuntime(27323):    at android.os.Handler.handleCallback(Handler.java:733)
04-29 15:25:02.030: E/AndroidRuntime(27323):    at android.os.Handler.dispatchMessage(Handler.java:95)
04-29 15:25:02.030: E/AndroidRuntime(27323):    at android.os.Looper.loop(Looper.java:136)
04-29 15:25:02.030: E/AndroidRuntime(27323):    at android.app.ActivityThread.main(ActivityThread.java:5017)
04-29 15:25:02.030: E/AndroidRuntime(27323):    at java.lang.reflect.Method.invokeNative(Native Method)
04-29 15:25:02.030: E/AndroidRuntime(27323):    at java.lang.reflect.Method.invoke(Method.java:515)
04-29 15:25:02.030: E/AndroidRuntime(27323):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
04-29 15:25:02.030: E/AndroidRuntime(27323):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
04-29 15:25:02.030: E/AndroidRuntime(27323):    at dalvik.system.NativeStart.main(Native Method)

2 个答案:

答案 0 :(得分:0)

看起来你没有在javaScriptInterface类中初始化WebView字段,但是你在getTextMenuBarJS()中调用了该变量的方法。这将导致空指针异常。

我怀疑你的意思是也要在javaScriptInterface构造函数中传递WebView实例。

答案 1 :(得分:0)

我找到了解决方案。错误来自javascriptInterface
我把它改成了类似的东西

public class JavaScriptHandler {

    WebView webview;

    public JavaScriptHandler(WebView activity) {
        webview = activity;
    }

    @JavascriptInterface
    public void JSfunction(String[] text){ 
        this.webview.dosomething();
    }

}

关于我的活动

webView.addJavascriptInterface(new JavaScriptHandler(this), "Android");
webView.loadUrl("javascript:(function() {"+ window.Android.JSfunction(); +"})();");