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.