2013-05-26 14 views
23

AndroidでWebviewに問題があり、JavascriptInterfacesです。時にはスローUncaught Error:Android上のNPObjectでメソッドを呼び出すときにエラーが発生しました。

文字列をJavascriptInterfaceに渡しています。デバッグするとき、私はAndroidアプリケーション内で正しい文字列を受け取ります。問題:時々、Uncaught Error:NPObjectでメソッドを呼び出す際にエラーが発生することがあります。

なぜ誰が知っていますか?

のJavaのインタフェース:

public class JSInterfaceGame extends JSInterface { 

@JavascriptInterface 
public void setShareText(String share){ 
    shareText = share; 
    if(mJSInterfaceListener != null) 
     mJSInterfaceListener.onParametersChanged(SHARE_TEXT); 
} 
断片内onCreateView-方法で初期化

:JavaScriptで

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

コール:あなたがしようとすると、

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

答えて

35

それが起こります、javascriptインターフェースから呼び出されるメソッドを使用して、UIとやり取りします。この方法でそれを解決するために:

class mJSInterface() 
{ 

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

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

    } 

} 
+0

あなたがJavaScriptから呼び出しているとき、すごい、それは検出することが難しいです、 – Pradeep

+1

私は同じ問題がありますが、私は間違いなくUIと対話していません。 – matteo

+4

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

4

は@Leog

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

からコメントをハイライト表示するにはこれはもう一つの理由は、WebViewCoreThreadRuntimeExceptionすることができ

3

私の誤差の源でした。 @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の答え@に加えてこれを取ります。 (:NPObject削除キャッチされないにReferenceErrorが)、最終的に私は解決策を見つける:

0

は、Android 4.4のWebView内のiframeのような例外が発生することがあり操作

@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"); 
} 
関連する問題