【问题标题】:Sometimes throws Uncaught Error: Error calling method on NPObject on Android有时会抛出未捕获的错误:Android 上 NPObject 上的错误调用方法
【发布时间】:2013-05-26 10:37:16
【问题描述】:

我在使用 Android 中的 Webview 时遇到问题,它是 JavascriptInterfaces。

我正在向 JavascriptInterface 传递一个字符串。在调试它时,我在我的 Android 应用程序中收到了正确的字符串。问题:有时我得到一个未捕获的错误:在 NPObject 上调用方法时出错。

有人知道为什么吗?

Java 中的接口:

public class JSInterfaceGame extends JSInterface {

@JavascriptInterface
public void setShareText(String share){
    shareText = share;
    if(mJSInterfaceListener != null)
        mJSInterfaceListener.onParametersChanged(SHARE_TEXT);
}

Fragment内onCreateView-Method中的初始化:

online = (WebView) rootView.findViewById(R.id.online);
online.setWebViewClient(new WISWebviewClient() {
  @Override
  public void onStatusChanged(final WebView view, int progress, long duration) {
    //unrelated
  }
});

WebSettings ws = online.getSettings();
ws.setJavaScriptEnabled(true);
ws.setUserAgentString(USER_AGENT);
ws.setCacheMode(WebSettings.LOAD_DEFAULT);
ws.setRenderPriority(WebSettings.RenderPriority.HIGH);

SharedPreferences settings = getActivity().getSharedPreferences(GameActivity.PREFERENCES, Context.MODE_PRIVATE);

mJSInterface = new JSInterfaceGame();
mJSInterface.setJSInterfaceListener(this); // Defined elsewhere in this class.
mJSInterface.setPlayerName(settings.getString(GameActivity.PREFS_PlAYERNAME, null));
online.addJavascriptInterface(mJSInterface, "JSInterface");
online.loadUrl("http://myurl.something");

在 Javascript 中调用:

function makeShareText() {
  var text = "Some text";
  console.log(typeof text); // Always a string.
  JSInterface.setShareText(text);
}

【问题讨论】:

    标签: android android-webview android-jsinterface


    【解决方案1】:

    当您尝试使用从 javascript 接口调用的方法与 UI 交互时,就会发生这种情况。以这种方式解决它:

    class mJSInterface()
    {
    
    public void myFunction()
    {
        runOnUiThread(new Runnable() {
    
                public void run() {
                    //Code that interact with UI
                }
            });
    
        }
    
    }
    

    【讨论】:

    • 哇,当您从 javascript 调用时,很难检测到,感谢指出
    • 我有同样的问题,但我肯定没有与 UI 交互。
    • 用错误的参数调用原生javascript函数也会出现同样的错误。
    【解决方案2】:

    突出@Leog 的评论

    如果你用错误的参数调用原生javascript函数也会出现同样的错误

    这是我的错误的根源

    【讨论】:

      【解决方案3】:

      另一个原因可能是WebViewCoreThread 上的RuntimeException。接收到@JavascriptInterface 调用后发生的任何异常如果仍在 WebView 线程上运行,将被记录为 NPObject 错误。总体而言,跟踪消息不足,几乎没有关于问题的线索。

      更正您在合适线程上处理 javascript 接口调用的问题。

      示例 A.(NPObject 错误):

      @JavascriptInterface
      public void jsCall() {
          Log.v(TAG, "Prepared NullPointerException on "+Thread.currentThread());
          String s = null;
          s.length();  // This will cause NPObject error
      }
      

      示例 B.(NullPointerException):

      @JavascriptInterface
      public void jsCall() {
          new Thread(new Runnable() {
              @Override
              public void run() {
                  Log.v(TAG, "Prepared NullPointerException on " + Thread.currentThread());
                  String s = null;
                  s.length();  // This will throw NullPointerException
              }
          }).start();
      }
      

      将此作为@Nico.S 答案的补充。

      【讨论】:

        【解决方案4】:

        在Android 4.4 WebView中操作iframe可能会出现类似异常(Uncaught ReferenceError: NPObject deleted),终于找到解决办法了:

        @Override
        public void onPageFinished(final WebView view, String finishUrl) {
            super.onPageFinished(view, finishUrl);
            // android 4.4 may lost value of 'Android' when operating iframe
            view.addJavascriptInterface(Activity.this, "Android");
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-01-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-11-27
          • 1970-01-01
          相关资源
          最近更新 更多