Иногда выдает сообщение об ошибке "Неисправность": ошибка вызова метода на NPObject на Android
У меня возникают проблемы с Webview в Android и JavascriptInterfaces.
Я передаю строку JavascriptInterface. При отладке я получаю правильную строку в своем приложении для Android. Проблема: Иногда я получаю сообщение об ошибке "Неисправность: ошибка" в NPObject.
Кто-нибудь знает, почему?
Интерфейс в Java:
public class JSInterfaceGame extends JSInterface {
@JavascriptInterface
public void setShareText(String share){
shareText = share;
if(mJSInterfaceListener != null)
mJSInterfaceListener.onParametersChanged(SHARE_TEXT);
}
Инициализация в методе onCreateView внутри фрагмента:
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");
Вызов в Javascript:
function makeShareText() {
var text = "Some text";
console.log(typeof text); // Always a string.
JSInterface.setShareText(text);
}
Ответы
Ответ 1
Это происходит, когда вы пытаетесь использовать метод, называемый интерфейсом javascript, для взаимодействия с пользовательским интерфейсом. Чтобы решить это так:
class mJSInterface()
{
public void myFunction()
{
runOnUiThread(new Runnable() {
public void run() {
//Code that interact with UI
}
});
}
}
Ответ 2
Чтобы выделить комментарий из @Leog
Такая же ошибка возникает, если вы вызываете собственную функцию javascript с неправильными параметрами
Это был источник моей ошибки
Ответ 3
Другая причина может быть RuntimeException
на WebViewCoreThread
. Любое исключение произошло после того, как вызов @JavascriptInterface
будет зарегистрирован как ошибка NPObject, если все еще выполняется в потоке WebView. Общее недостаточное сообщение о трассировке с небольшим пониманием проблемы.
Исправьте свою проблему при обработке вызова интерфейса JavaScript на подходящем потоке.
Пример A. (Ошибка NPObject):
@JavascriptInterface
public void jsCall() {
Log.v(TAG, "Prepared NullPointerException on "+Thread.currentThread());
String s = null;
s.length(); // This will cause NPObject error
}
Пример 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();
}
Возьмите это как дополнение к ответу @Nico.S.
Ответ 4
Работает iframe в Android 4.4 WebView может вызвать аналогичное исключение (Uncaught ReferenceError: NPObject удален), наконец, я выясню решение:
@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");
}