Jette parfois une erreur non interceptée: méthode d'appel D'erreur sur NPObject sur Android

J'ai des problèmes avec le Webview dans Android et C'est JavascriptInterfaces.

Je passe une chaîne à JavascriptInterface. 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 interceptée: méthode d'appel D'erreur sur NPObject.

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

Appelez Javascript:

function makeShareText() {
  var text = "Some text";
  console.log(typeof text); // Always a string.
  JSInterface.setShareText(text);
}
23
demandé sur janwo 2013-05-26 14:37:16

4 réponses

Cela se produit lorsque vous essayez, en utilisant la méthode appelée à partir de l'interface javascript, d'interagir avec L'interface utilisateur. Pour le résoudre de cette façon:

class mJSInterface()
{

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

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

    }

}
35
répondu Nico.S 2013-06-21 08:39:22

Pour mettre en évidence le commentaire de @Leog

La même erreur se produit si vous appelez la fonction JavaScript native avec de mauvais paramètres

C'était la source de mon erreur

5
répondu cloakedninjas 2014-08-17 17:50:27

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

Corrigez votre problème avec la gestion de l'appel d'interface javascript sur un thread 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 à @ Nico.S de la réponse.

3
répondu dobridog 2014-11-17 15:33:47

Utiliser iframe dans 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
répondu Bruce 2014-12-01 07:09:04