24

我在使用 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);
}
4

4 回答 4

36

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

class mJSInterface()
{

public void myFunction()
{
    runOnUiThread(new Runnable() {

            public void run() {
                //Code that interact with UI
            }
        });

    }

}
于 2013-06-21T08:39:22.463 回答
5

突出来自@Leog 的评论

如果您使用错误的参数调用本机 javascript 函数,则会发生相同的错误

这是我错误的根源

于 2014-08-17T17:50:27.443 回答
4

另一个原因可能是 a RuntimeExceptionon a WebViewCoreThread。如果仍然在 WebView 线程上运行,则接收调用后发生的任何异常@JavascriptInterface都将记录为 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 答案的补充。

于 2014-11-17T15:33:47.053 回答
0

在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");
}
于 2014-12-01T07:09:04.543 回答