我尝试从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)
答案 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(); +"})();");