2017-06-30 1 views
0

Grüße Kollegen aus der Welt Xamarin. Ich brauche Hilfe.Xamarin + Mvvmcross + Multidex Absturz beim Wechsel auf/offline

Ich entwickelte eine Anwendung in Xamarin mit Mvvmcross 4.4 und Firebase. Im Android-Projekt musste ich multidex implementieren. Das Problem tritt auf, wenn die Anwendung ausgeführt wird und die Verbindung verloren geht (Flugzeugmodus, WLAN deaktiviert usw.) oder umgekehrt.

In der benutzerdefinierten Liste zum Erstellen des Multidex sind alle Hauptabhängigkeiten zu Firebase, der Anwendung selbst und dem Framework in der Hauptdatei enthalten.

Der gemeldete Absturz drückt aber dies:

java.lang.RuntimeException: Unable to instantiate receiver com.developer.appname.Reachability: java.lang.ClassNotFoundException: Didn't find class "com.developer.appname.Reachability" on path: DexPathList[[zip file "/data/app/com.developer.appname-1/base.apk"],nativeLibraryDirectories=[/data/app/com.developer.appname-1/lib/arm, /vendor/lib, /system/lib]] 
android.app.ActivityThread.handleReceiver()ActivityThread.java:2926 
android.app.ActivityThread.access$1800()ActivityThread.java:172 
android.app.ActivityThread$H.handleMessage()ActivityThread.java:1499 
android.os.Handler.dispatchMessage()Handler.java:102 
android.os.Looper.loop()Looper.java:145 
android.app.ActivityThread.main()ActivityThread.java:5832 
java.lang.reflect.Method.invoke(Native Method) 
java.lang.reflect.Method.invoke()Method.java:372 
com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run()ZygoteInit.java:1399 
com.android.internal.os.ZygoteInit.main()ZygoteInit.java:1194 
Caused by: java.lang.ClassNotFoundException: Didn't find class "com.developer.appname.Reachability" on path: DexPathList[[zip file "/data/app/com.developer.appname-1/base.apk"],nativeLibraryDirectories=[/data/app/com.developer.appname-1/lib/arm, /vendor/lib, /system/lib]] 
dalvik.system.BaseDexClassLoader.findClass()BaseDexClassLoader.java:56 
java.lang.ClassLoader.loadClass()ClassLoader.java:511 
java.lang.ClassLoader.loadClass()ClassLoader.java:469 
android.app.ActivityThread.handleReceiver()ActivityThread.java:2921 
... 9 more 

Erreichbarkeits den Zustand der Verbindung überprüft und wird aus dem Kern verwendet:

public class Reachability : BroadcastReceiver, IReachability { ... } 

<application android:name=".appname" android:label="@string/app_name" android:icon="@mipmap/ic_launcher" android:allowBackup="true"> 
    <receiver android:name=".Reachability"> 
     <intent-filter> 
      <action android:name="android.net.conn.CONNECTIVITY_CHANGE" /> 
     </intent-filter> 
    </receiver> 

Wenn die Anwendung gestartet wird offline wird erfasst, richtig und fährt fort, um die erwarteten Daten aus dem Cache anzuzeigen. Das Gleiche passiert, wenn die App gestartet wird und eine Verbindung besteht, dass die Daten in Echtzeit vom Firebase angezeigt werden. Hervorhebung, es schlägt nur fehl, wenn die Verbindung entsprechend dem vorherigen Zustand ein- oder ausgeschaltet wird.

Vielen Dank, jede Hilfe ist willkommen.

Antwort

1

Unable Empfänger com.developer.appname.Reachability instanziiert: java.lang.ClassNotFoundException: Haben Sie nicht gefunden Klasse "com.developer.appname.Reachability"

Ich habe Ihr Problem reproduziert und eine Lösung gefunden. Wie SushiHangover sagte, Xamarin auto-generates class ids if you do not specify one via an Attribute. Xamarin verwendet Attributes in Code, um die Manifest beim Erstellen zu füllen. Here ist das Dokument zum Erstellen eines BraoadcastReceiver mit Attributes.

Wenn Sie Attributes für Ihre BroadcastReceiver:

[BroadcastReceiver(Enabled = true, Exported = false)] 
[IntentFilter(new[] { Android.Net.ConnectivityManager.ConnectivityAction })] 
public class Reachability : BroadcastReceiver { ... } 

Registrieren BroadcastReceiver:

Reachability mReceiver = new Reachability(); 
RegisterReceiver(mReceiver, new IntentFilter(ConnectivityManager.ConnectivityAction)); 

Es funktioniert gut.

+0

Dank @York Shen, Ihr Rat war sehr nützlich. Dies und während der Implementierung der Anwendung wird der Erreichbarkeitsdienst als Singleton registriert, der von dem Kern zu verwenden ist. Wenn jedoch ein OnReceive auftritt, nahm ich an, dass eine andere Kopie des Dienstes verwendet wird, die sich von der im Setup registrierten unterscheidet. Ich wusste dies, die Variable, die für die erforderliche Aktion innerhalb der Erreichbarkeitsklasse verwendet wurde, und erklärte sie als statisch und von dort hat alles gut funktioniert. – Helper

Verwandte Themen