web-dev-qa-db-fra.com

Lance parfois une erreur non capturée: erreur lors de l’appel de la méthode sur NPObject sur Android

J'ai des problèmes avec la Webview sous Android et c'est JavascriptInterfaces.

Je passe une chaîne à l'interface Javascript. Lors du débogage, je reçois la chaîne correcte dans mon application Android. Le problème: Parfois, je reçois une erreur non récupérée: erreur lors de l’appel d’une méthode sur NPObject.

Est-ce que quelqu'un sait pourquoi?

L'interface en Java:

public class JSInterfaceGame extends JSInterface {

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

L'initialisation dans la méthode onCreateView dans le fragment:

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

Appeler en Javascript:

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

Cela se produit lorsque vous essayez, à l'aide d'une méthode appelée à partir d'une interface javascript, d'interagir avec l'interface utilisateur. Pour le résoudre de cette manière:

class mJSInterface()
{

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

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

    }

}
35
Nico.S

Pour mettre en évidence le commentaire de @Leog 

La même erreur se produit si vous appelez la fonction javascript native avec des paramètres incorrects

C'était la source de mon erreur

5
cloakedninjas

Une autre raison peut être RuntimeException sur WebViewCoreThread. Toute exception survenue après la réception de l'appel @JavascriptInterface sera consignée en tant qu'erreur NPObject si elle est toujours en cours d'exécution sur un thread WebView. Message de trace globalement insuffisant avec peu d'indice sur le problème. 

Corrigez le problème lié à la gestion de l'appel de l'interface javascript sur un fil approprié. 

Exemple A. (erreur NPObject):

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

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

Prenez ceci comme un ajout à la réponse de @ Nico.S.

3
dobridog

Utiliser iframe sous Android 4.4 WebView peut provoquer une exception similaire (Uncaught ReferenceError: NPObject supprimé), enfin je trouve la solution:

@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