2016-03-26 5 views
5

Ich benutze Ionic Framework, um die Hybrid-Android-App zu bauen und die App funktioniert gut. Ich benutze das Fabric Crash Analytics Plugin und berichte über die Abstürze der App.NullPointerException in Cordova App gemeldet von Fabric SDK

Ich bekomme die folgenden Crash-Details sehr oft und nicht sicher, was der Grund für das gleiche ist. Ich bin nicht sicher, was der Ausgangspunkt wäre, um das zu analysieren.

Fatal Exception: java.lang.NullPointerException 
     at android.webkit.WebViewClassic.setNetworkAvailable(WebViewClassic.java:4224) 
     at android.webkit.WebView.setNetworkAvailable(WebView.java:731) 
     at org.apache.cordova.engine.SystemWebViewEngine$1.setNetworkAvailable(SystemWebViewEngine.java:112) 
     at org.apache.cordova.NativeToJsMessageQueue$OnlineEventsBridgeMode$2.run(NativeToJsMessageQueue.java:340) 
     at android.os.Handler.handleCallback(Handler.java:725) 
     at android.os.Handler.dispatchMessage(Handler.java:92) 
     at android.os.Looper.loop(Looper.java:176) 
     at android.app.ActivityThread.main(ActivityThread.java:5319) 
     at java.lang.reflect.Method.invokeNative(Method.java) 
     at java.lang.reflect.Method.invoke(Method.java:511) 
     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1102) 
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:869) 
     at dalvik.system.NativeStart.main(NativeStart.java) 

Ist es mit einem Plugin oder einem Problem in Ionic oder Cordvoa verbunden? Jede Hilfe oder Beratung wäre hilfreich.

Antwort

2

Ich habe das gleiche Problem. Ich benutze auch Cordova und Fabric Crashlytics.

Es ist nur auf Android 4.1.2, 4.2.2, 4.3 reproduziert.

Ich habe den Fehler reproduziert:

  1. offen WebView mit Inhalten, die JavaScript-Funktionen enthalten;
  2. öffnen Sie neues WebView und schließen Sie es;
  3. deaktivieren Sie das Netzwerk (WLAN und Handy) so schnell wie möglich;
  4. zurück zur App und StackTrace anzeigen.

fand ich eine Lösung:

Ich bin nicht CordovaActivity in meiner App. Ich benutze CordovaInterface. Der mit dem gelöschten WebView verknüpfte PluginManager ruft weiterhin seine Methoden auf. Ich rufe WebView.handleDestroy() manuell auf, um PluginManager zu zerstören.

In meinem Fragment:

@Override 
public void onDestroy() 
{ 
    if (webView != null) 
    { 
     webView.handleDestroy(); 
     webView.destroy(); 
     webView = null; 
    } 

    super.onDestroy(); 
} 

Update: Es reproduziert wird, wenn Sie WebView zerstören, aber Plugin weiter zu leben und sendet javascripts Ereignisse an Teilnehmer (WebViews). Weil ich WebView.handleDestroy() aufrufen.

+0

Könnten Sie bitte erklären, welche .java-Datei mit diesem zu bearbeiten? – Purus

+0

Ich habe onDestroy() -Methode für meine Klasse erweitert Fragment bearbeitet. Meine Klasse erstellt WebView und manipuliert es. – ilyamuromets

+0

Können Sie mir Ihren Beispielcode schicken, damit ich hier einen guten Repro-Fall bekommen kann? Ich würde gerne einen guten JUnit Testfall bekommen und diesen Code direkt in CordovaAndroid/CordovaInterface onDestroy ziehen –

2

Sie könnten die Ausnahme verschlucken? Bearbeiten Sie diese Datei:

/platforms/android/CordovaLib/src/org/apache/cordova/engineChange/SystemWebViewEngine.java

und ändern diese

webView.setNetworkAvailable(value); 

dieser

import java.lang.NullPointerException; 
... 
try { 
    webView.setNetworkAvailable(value); 
} 
catch (NullPointerException e) { 
    Log.d(TAG, "webView.setNetworkAvailable called after destroy"); 
} 

nicht wirklich eine Lösung, aber die Schwierigkeit bei der Wiedergabe von lokal gegeben, kann es eine Option sein sich überlegen.

0

Meine Lösung war in SystemWebViewEngine.java.

  1. Änderung protected final SystemWebView webView; zu protected SystemWebView webView;

  2. in destroy() Verfahren nach

if (receiver != null) { try { webView.getContext().unregisterReceiver(receiver); } catch (Exception e) { Log.e(TAG, "Error unregistering configuration receiver: " + e.getMessage(), e); } }

hinzufügen

webView = null;

  1. ersetzen webView.setNetworkAvailable(value); mit

    if (webView != null) webView.setNetworkAvailable(value);

Verwandte Themen