it-swarm.com.de

Wirft manchmal einen nicht erfassten Fehler: Fehler beim Aufruf der Methode für NPObject unter Android

Ich habe Probleme mit dem Webview in Android und den JavascriptInterfaces.

Ich übergebe einen String an das JavascriptInterface. Beim Debuggen erhalte ich die korrekte Zeichenfolge in meiner Android-Anwendung. Das Problem: Manchmal bekomme ich einen Uncanced Error: Error Aufrufmethode für NPObject.

Weiß jemand warum?

Die Schnittstelle in Java:

public class JSInterfaceGame extends JSInterface {

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

Die Initialisierung in der onCreateView-Methode innerhalb des Fragments:

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");

In Javascript anrufen:

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

Dies geschieht, wenn Sie versuchen, mit der von der Javascript-Schnittstelle aufgerufenen Methode zu interagieren, um mit der Benutzeroberfläche zu interagieren. Um es auf diese Weise zu lösen:

class mJSInterface()
{

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

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

    }

}
35
Nico.S

Um den Kommentar von @Leog hervorzuheben 

Der gleiche Fehler tritt auf, wenn Sie die native JavaScript-Funktion mit falschen Parametern aufrufen

Dies war die Quelle meines Fehlers

5
cloakedninjas

Ein anderer Grund kann eine RuntimeException auf einer WebViewCoreThread sein. Jede Ausnahme, die nach dem Empfang eines @JavascriptInterface-Aufrufs aufgetreten ist, wird als NPObject-Fehler protokolliert, wenn sie noch in einem WebView-Thread ausgeführt wird. Insgesamt unzureichende Trace-Nachricht mit wenig Ahnung über das Problem. 

Korrigieren Sie Ihr Problem bei der Handhabung von JavaScript-Schnittstellenaufrufen in einem geeigneten Thread. 

Beispiel A. (NPObject-Fehler):

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

Beispiel 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();
}

Nehmen Sie dies als Ergänzung zur Antwort von @ Nico.S.

3
dobridog

Wenn Sie iframe in Android 4.4 WebView betreiben, kann dies zu einer ähnlichen Ausnahme führen (Uncear ReferenceError: NPObject gelöscht).

@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");
}
0
Bruce