2016-03-26 15 views
5

Korzystam z Ionic framework do budowy hybrydowej aplikacji na Androida, a aplikacja działa dobrze. Korzystam z wtyczki analytics Fabric Crash i zgłaszam awarie aplikacji.NullPointerException w aplikacji Cordova zgłoszone przez Fabric SDK

Bardzo często uzyskuję poniższe informacje o awarii i nie jestem pewien, jaki jest tego powód. Nie jestem pewien, co byłoby punktem wyjścia do rozpoczęcia analizy tego.

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) 

Czy jest to związane z jakąkolwiek wtyczką lub jakimkolwiek problemem w Ionic lub Cordvoa? Pomocna będzie każda pomoc lub porada.

Odpowiedz

2

Mam ten sam problem. Używam także Cordova i Fabric Crashlytics.

Jest kopiowany tylko na Androida 4.1.2, 4.2.2, 4.3.

Mam powielana błąd:

  1. otwarty Webview z treści, które zawierają funkcje javascript;
  2. otwórz nowy WebView i zamknij go;
  3. wyłączyć sieć (wifi i mobilną) tak szybko, jak to możliwe;
  4. powrót do aplikacji i pokazanie stosu.

znalazłem rozwiązanie:

nie używam CordovaActivity w mojej aplikacji. Używam CordovaInterface. PluginManager skojarzony z usuniętym WebView nadal wywołuje jego metody. Więc ręcznie wywołać WebView.handleDestroy(), aby zniszczyć PluginManager.

W moim Fragment:

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

    super.onDestroy(); 
} 

Aktualizacja: To powielana kiedy zniszczyć WebView, ale PluginManager nadal żyje i wysyła javascripts zdarzenia abonentów (WebViews). Ponieważ nazywam WebView.handleDestroy().

+0

Czy mógłbyś wyjaśnić, które .java plik do edycji z tym? – Purus

+0

Edytowałem metodę onestest() na rozszerzonym fragmencie klasy. Moja klasa tworzy WebView i manipuluje nim. – ilyamuromets

+0

Czy możesz wysłać mi swój przykładowy kod, aby uzyskać tutaj prawidłowy przypadek repro? Chciałbym dostać dobry testowy JUnit i przenieść ten kod bezpośrednio do CordovaAndroid/CordovaInterface onDestroy –

2

Możesz połknąć wyjątek? Edytować ten plik

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

I to zmienić

webView.setNetworkAvailable(value); 

do tego

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

naprawdę nie jest rozwiązanie, ale biorąc pod uwagę trudności w reprodukcji lokalnie, może to być opcja rozważyć.

0

Moje rozwiązanie było w SystemWebViewEngine.java.

  1. zmiana protected final SystemWebView webView; do protected SystemWebView webView;

  2. w destroy() metody po

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

dodać

webView = null;

  1. Wymień webView.setNetworkAvailable(value); z

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

Powiązane problemy