web-dev-qa-db-ja.com

AndroidのNPObjectでメソッドを呼び出すときにエラーが発生する

AndroidのWebviewに問題があり、それは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-Methodでの初期化:

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);
}
23
janwo

これは、JavaScriptインターフェースから呼び出されたメソッドを使用して、UIを操作しようとすると発生します。この方法で解決するには:

class mJSInterface()
{

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

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

    }

}
35
Nico.S

@Leogからのコメントを強調表示するには

間違ったパラメーターでネイティブJavaScript関数を呼び出すと、同じエラーが発生します

これが私のエラーの原因でした

5
cloakedninjas

別の理由として、RuntimeExceptionWebViewCoreThreadが考えられます。 @JavascriptInterface呼び出しの受信後に発生した例外は、WebViewスレッドで実行されている場合、NPObjectエラーとしてログに記録されます。問題についての手掛かりがほとんどない全体的に不十分なトレースメッセージ。

適切なスレッドでの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の回答への追加として受け取ります。

3
dobridog

Android= 4.4でiframeを操作すると、4.4 WebViewで同様の例外が発生する可能性があります(Uncaught ReferenceError:NPObject deleted))。

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