2013-05-26 4 views
23

मुझे एंड्रॉइड में वेबव्यू के साथ समस्याएं आ रही हैं और यह जावास्क्रिप्टइंटरफेस है।कभी-कभी अनकॉच त्रुटि फेंकता है: एंड्रॉइड पर एनपीओब्जेक्ट पर विधि कॉल करने में त्रुटि

मैं जावास्क्रिप्ट इंटरफेस में एक स्ट्रिंग पास कर रहा हूं। इसे डिबग करने पर, मुझे अपने एंड्रॉइड एप्लिकेशन में सही स्ट्रिंग मिलती है। समस्या: कभी-कभी मुझे एक असफल त्रुटि मिलती है: एनपीओब्जेक्ट पर विधि कॉल करने में त्रुटि।

क्या कोई जानता है क्यों?

जावा में इंटरफ़ेस:

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

जावास्क्रिप्ट में कॉल:

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

उत्तर

35

यह होता है जब आप की कोशिश , यूआई के साथ बातचीत करने के लिए जावास्क्रिप्ट इंटरफ़ेस से बुलाए गए विधि का उपयोग करना। इस तरह से इसे हल करने के लिए:

class mJSInterface() 
{ 

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

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

    } 

} 
+0

वाह, जब आप जावास्क्रिप्ट से फोन कर रहे हैं, यह मुश्किल पता लगाने के लिए है, – Pradeep

+1

को इंगित करने के लिए धन्यवाद मुझे एक ही समस्या है लेकिन मैं निश्चित रूप से यूआई के साथ बातचीत नहीं कर रहा हूं। – matteo

+4

वही त्रुटि होती है यदि आप मूल पैरामीटर के साथ मूल जावास्क्रिप्ट फ़ंक्शन को कॉल करते हैं। –

4

@Leog

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

से टिप्पणी हाइलाइट करने के लिए यह मेरा त्रुटि के स्रोत

3

एक अन्य कारण एक WebViewCoreThread पर एक RuntimeException हो सकता था। @JavascriptInterface प्राप्त करने के बाद कोई अपवाद हुआ, यदि वेबव्यू थ्रेड पर अभी भी चल रहा है तो कॉल को एनपीओब्जेक्ट त्रुटि के रूप में लॉग किया जाएगा। समस्या के बारे में थोड़ा सुराग के साथ कुल मिलाकर अपर्याप्त ट्रेस संदेश।

उपयुक्त थ्रेड पर जावास्क्रिप्ट इंटरफ़ेस कॉल को संभालने के साथ अपनी समस्या को ठीक करें।

उदाहरण ए (NPObject त्रुटि):

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

उदाहरण बी (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 के जवाब देने के लिए एक अतिरिक्त के रूप यह लो।

0

प्रचालन में 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"); 
} 
संबंधित मुद्दे