2016-03-26 8 views
5

Utilizzo la struttura Ionic per creare l'app ibrida per Android e l'app funziona correttamente. Sto usando il plug-in Analitica Fabric Crash e il suo resoconto degli arresti anomali dell'app.NullPointerException in Cordova App segnalato da Fabric SDK

Sto ottenendo i dettagli di crash di seguito molto spesso e non sono sicuro di quale sia la ragione dello stesso. Non sono sicuro di quale sarebbe il punto di partenza per iniziare a analizzarlo.

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) 

È collegato a qualsiasi plug-in o qualsiasi problema in Ionic o Cordvoa? Qualsiasi aiuto o consiglio sarebbe utile.

risposta

2

Ho lo stesso problema. Uso anche Cordova e Fabric Crashlytics.

È riprodotto solo su Android 4.1.2, 4.2.2, 4.3.

ho riprodotto il bug:

  1. aperta WebView con i contenuti che contengono funzioni JavaScript;
  2. aprire una nuova WebView e chiuderla;
  3. disabilitare la rete (wifi e mobile) il prima possibile;
  4. tornare all'app e mostrare lo stacktrace.

ho trovato una soluzione:

non sto usando CordovaActivity nella mia app. Sto usando CordovaInterface. PluginManager associato a WebView cancellato continua a chiamare i suoi metodi. Quindi io manuale chiamata WebView.handleDestroy() per distruggere PluginManager.

Nel mio Frammento:

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

    super.onDestroy(); 
} 

Aggiornamento: E 'riprodotto quando si distrugge WebView, ma PluginManager continua a vivere e invia javascripts eventi per gli abbonati (visualizzazioni). Perché chiamo WebView.handleDestroy().

+0

Potrebbe spiegare che .java file da modificare con questo? – Purus

+0

Ho modificato il metodo onDestroy() sulla mia classe estesa Fragment. La mia classe crea WebView e lo manipola. – ilyamuromets

+0

Puoi inviarmi il tuo codice di esempio in modo da poter ottenere un buon caso di riproduzione qui? Mi piacerebbe ottenere un buon test case JUnit e inserire questo codice direttamente in CordovaAndroid/CordovaInterface onDestroy –

2

Si può ingoiare l'eccezione? Modifica questo file:

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

E cambiare questo

webView.setNetworkAvailable(value); 

a questo

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

Non proprio una soluzione, ma data la difficoltà nel riprodurre a livello locale, può essere un'opzione considerare.

0

La mia soluzione era in SystemWebViewEngine.java.

  1. cambiamento protected final SystemWebView webView; al protected SystemWebView webView;

  2. in destroy() metodo dopo

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

aggiungere

webView = null;

  1. Sostituire webView.setNetworkAvailable(value); con

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

Problemi correlati