studio propiedades example codigo android android-webview android-jsinterface

propiedades - A veces produce un error no detectado: error al llamar al método en NPObject en Android



webview android stack overflow (4)

Estoy teniendo problemas con la vista web en Android y es JavascriptInterfaces.

Estoy pasando una cadena a la JavascriptInterface. Cuando lo depuro, recibo la cadena correcta dentro de mi aplicación de Android. El problema: a veces me sale un error no detectado: error al llamar al método en NPObject.

¿Alguien sabe por qué?

La interfaz en Java:

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

La inicialización en el método onCreateView dentro del fragmento:

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

Llamar en Javascript:

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


Ocurre cuando lo intentas, usando un método llamado desde la interfaz javascript, para interactuar con la IU. Para resolverlo de esta manera:

class mJSInterface() { public void myFunction() { runOnUiThread(new Runnable() { public void run() { //Code that interact with UI } }); } }


Operar iframe en Android 4.4 WebView puede causar una excepción similar (Uncught ReferenceError: NPObject eliminado), finalmente descubro la solución:

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


Otra razón puede ser una WebViewCoreThread RuntimeException en un WebViewCoreThread . Cualquier excepción ocurrida después de recibir la llamada @JavascriptInterface se registrará como error NPObject si aún se está ejecutando en un hilo de WebView. Mensaje de rastreo insuficiente en general con poca pista sobre el problema.

Corrija su problema manejando la llamada de la interfaz de javascript en un hilo adecuado.

Ejemplo A. (error NPObject):

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

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

Toma esto como una adición a la respuesta de @ Nico.S.


Para resaltar el comentario de @Leog

El mismo error ocurre si llama a la función javascript nativa con parámetros incorrectos

Esta fue la fuente de mi error.