2013-05-26 12 views
23

Ho problemi con la Webview in Android e sono JavascriptInterfaces.Talvolta genera errore Uncaught: Errore nel chiamare il metodo su NPObject su Android

Sto passando una stringa a JavascriptInterface. Durante il debug, ricevo la stringa corretta all'interno della mia applicazione Android. Il problema: a volte viene visualizzato un errore Uncaught: errore nel chiamare il metodo su NPObject.

Qualcuno sa perché?

L'interfaccia in Java:

public class JSInterfaceGame extends JSInterface { 

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

L'inizializzazione nel onCreateView-Metodo all'interno del frammento:

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

chiamate in Javascript:

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

risposta

35

Succede quando si tenta , usando il metodo chiamato dall'interfaccia javascript, per interagire con l'interfaccia utente. Per risolto in questo modo:

class mJSInterface() 
{ 

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

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

    } 

} 
+0

wow, quando si chiama da JavaScript, è difficile da individuare, grazie per aver segnalato – Pradeep

+1

ho lo stesso problema ma sicuramente non sto interagendo con l'interfaccia utente. – matteo

+4

Lo stesso errore si verifica se si chiama la funzione javascript nativa con parametri errati. –

4

Per evidenziare il commento da @Leog

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

Questa è stata la fonte del mio errore

3

Un altro motivo può essere un RuntimeException su un WebViewCoreThread. Qualsiasi eccezione si è verificata dopo aver ricevuto la chiamata @JavascriptInterface verrà registrata come errore NPObject se ancora in esecuzione su un thread WebView. Messaggio di tracciamento complessivo insufficiente con un minimo indizio sul problema.

Correggere il problema con la gestione della chiamata di interfaccia javascript su un thread appropriato.

Esempio A. (errore NPObject):

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

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

Prendete questo in aggiunta alla @ di Nico.S risposta.

0

Operare iframe in Android 4.4 WebView può causare un'eccezione simile (Uncaught ReferenceError: NPObject cancellato), finalmente ho trovato la soluzione:

@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"); 
} 
Problemi correlati