2013-05-26 3 views
23

Ich habe Probleme mit dem Webview in Android und es ist JavascriptInterfaces.Manchmal wirft Uncaught Error: Fehler beim Aufrufen von Methode auf NPObject auf Android

Ich übergebe eine Zeichenfolge an das JavascriptInterface. Beim Debuggen erhalte ich die korrekte Zeichenfolge in meiner Android-Anwendung. Das Problem: Manchmal bekomme ich einen Uncaught 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 im onCreateView-Methode im 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"); 

Anruf in Javascript:

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

Antwort

35

Es passiert, wenn Sie versuchen, Verwenden Sie die von javascript interface aufgerufene Methode, um mit der Benutzeroberfläche zu interagieren. Um es auf diese Weise gelöst:

class mJSInterface() 
{ 

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

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

    } 

} 
+0

wow, wenn Sie von Javascript anrufen, es ist schwer zu erkennen, Danke für das Aufzeigen – Pradeep

+1

Ich habe das gleiche Problem, aber ich bin definitiv nicht mit der Benutzeroberfläche interagieren. – matteo

+4

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

4

den Kommentar von @Leog markieren

The same error occurs if you call the native javascript function with wrong parameters

Dies war die Quelle meines Fehlers

3

Ein weiterer Grund, ein RuntimeException auf einem WebViewCoreThread sein kann. Jede Ausnahme, die nach dem Empfang des @JavascriptInterface-Aufrufs auftritt, wird als NPObject-Fehler protokolliert, wenn sie noch in einem WebView-Thread ausgeführt wird. Insgesamt unzureichende Trace-Nachricht mit wenig Hinweis auf das Problem.

Korrigieren Sie Ihr Problem mit der Bearbeitung von JavaScript-Schnittstelle Anruf auf 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 (Nullpointer):

@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 zu @ Nico.S Antwort.

0

iframe Operate in Android 4.4 WebView eine ähnliche Ausnahme verursachen können (Uncaught Reference: NPObject gelöscht), endlich herauszufinden, ich die Lösung:

@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"); 
} 
Verwandte Themen