2013-05-26 7 views
23

Android'de Web görünümünde ve Javascript Arabirimlerinde sorun yaşıyorum.Bazen Atakan Hata atar: NPObject'te Hata Çağrma yöntemi Android'de

Javascript Arabirimine bir dize iletiyorum. Hata ayıkladığında Android uygulamamda doğru dizeyi alıyorum. Sorun: Bazen bir Sahte Hata alıyorum: NPObject üzerinde hata arama yöntemi.

Nedenini bilen var mı?

Java Arayüz:

public class JSInterfaceGame extends JSInterface { 

@JavascriptInterface 
public void setShareText(String share){ 
    shareText = share; 
    if(mJSInterfaceListener != null) 
     mJSInterfaceListener.onParametersChanged(SHARE_TEXT); 
} 
Fragment içinde onCreateView-Yönteminde başlatma

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

Çağrı: Eğer çalıştığınızda

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

cevap

35

Olur böyle şeyler , kullanıcı arabirimi ile etkileşim kurmak için javascript arabiriminden çağrılan yöntemi kullanır. Bu şekilde o münhal için:

class mJSInterface() 
{ 

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

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

    } 

} 
+0

Eğer javascript ararken de vay, bunu tespit etmek zor, – Pradeep

+1

'u işaret ettiğin için teşekkürler Aynı problemim var ama kesinlikle UI ile etkileşimde değilim. – matteo

+4

Yerel javascript işlevini yanlış parametrelerle çağırırsanız, aynı hata oluşur. –

4

@Leog

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

yorumunu vurgulamak için bu başka neden bir WebViewCoreThread üzerinde RuntimeException olabilir

3

benim hata kaynağıydı. @JavascriptInterface çağrı alındıktan sonra herhangi bir özel durum, hala bir WebView iş parçacığında çalışıyorsa NPObject hatası olarak kaydedilir. Sorun hakkında az ipucu ile genel yetersiz izleme mesajı.

Uygun bir iş parçacığı üzerinde javascript arabirimi çağrısıyla sorununuzu düzeltin.

Örnek A (NPObject hatası):

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

Örnek 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 cevabı bir ek olarak alın. (: NPObject silindi Yakalanmamış ReferenceError), son olarak çözüm bulmak:

0

Android 4.4 WebView'da iframe benzer bir istisna neden olabilir İşlet

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