2013-05-26 8 views
23

Mam problemy z podglądem strony w Androidzie i JavaScriptInterfaces.Czasami wyrzuca Uncaught Error: Błąd podczas wywoływania metody na NPObject na Androidzie

Podaję ciąg znaków do JavascriptInterface. Podczas debugowania otrzymuję prawidłowy ciąg w mojej aplikacji na Androida. Problem: Czasami pojawia się błąd Uncaught Error: Error calling na NPObject.

Czy ktoś wie, dlaczego?

Interfejs Java:

public class JSInterfaceGame extends JSInterface { 

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

Inicjalizacja w onCreateView sposobie we fragmencie:

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

połączeń w JavaScript:

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

Odpowiedz

35

Zdarza się podczas próby , używając metody wywoływanej z interfejsu javascript, do interakcji z interfejsem użytkownika. Aby rozwiązać to w ten sposób:

class mJSInterface() 
{ 

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

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

    } 

} 
+0

wow, gdy dzwonisz z javascript, jest to trudne do wykrycia, dzięki za wskazanie – Pradeep

+1

Mam ten sam problem, ale zdecydowanie nie wchodzę w interakcje z interfejsem użytkownika. – matteo

+4

Ten sam błąd występuje, jeśli wywołasz funkcję macierzystego javascript z niewłaściwymi parametrami. –

4

aby podświetlić komentarz od @Leog

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

To było źródłem mojego błędu

3

Innym powodem może być RuntimeException na WebViewCoreThread. Każdy wyjątek wystąpił po odebraniu połączenia @JavascriptInterface zostanie zarejestrowany jako błąd NPObject, jeśli nadal działa w wątku WebView. Ogólnie niewystarczająca wiadomość śledzenia z małą wskazówką dotyczącą problemu.

Rozwiąż problem z obsługą wywołania interfejsu javascript w odpowiednim wątku.

Przykład A. (błąd NPObject):

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

Przykład 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(); 
} 

Weź to jako dodatek do użytkownika @ Nico.S odpowiedź.

0

obsługiwać iframe w Android 4.4 WebView może spowodować podobny wyjątek (Uncaught ReferenceError: NPObject skreślony), wreszcie dowiem rozwiązanie:

@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"); 
} 
Powiązane problemy