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