【问题标题】:Android calling Android function fron JavaScript using javascriptInterfaceAndroid使用javascript接口从JavaScript调用Android函数
【发布时间】:2014-04-29 22:43:46
【问题描述】:

我尝试从 html 文件调用 java 函数,但我不能。
我试图在我的 javascriptInterface 类上添加一个线程,但应用程序崩溃了。 (空指针)
我知道当 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)

【问题讨论】:

    标签: android android-webview


    【解决方案1】:

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

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

    【讨论】:

    • getTextMenuBarJS 不会导致空指针。我想从 webview 活动中修改一个静态字符串 []。例如,当我 WebView.valueReceived.add(text); 时出现空指针;我应该如何初始化 webview 字段?
    • 在 javaScriptInterface 的构造函数中传入(与您设置 Context 相同的位置)似乎是合理的。听起来您的初始帖子中缺少一些代码,因此很难诊断问题:-)
    【解决方案2】:

    我找到了解决方案。错误来自 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(); +"})();");
    

    【讨论】:

    • 意图在 JavascriptInterface 中不起作用。你有什么想法吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-15
    • 2014-08-03
    • 1970-01-01
    相关资源
    最近更新 更多