2017-06-30 14 views
0

Salutations collègues du monde xamarin. J'ai besoin d'aide.Xamarin + Mvvmcross + Multidex crash lors du changement on/offline

J'ai développé une application dans Xamarin avec Mvvmcross 4.4 et Firebase. Dans le projet Android, j'ai dû implémenter multidex. Le problème qui se produit est lorsque l'application est en cours d'exécution et la connexion est perdue (mode avion, wifi désactivé, etc.) ou vice versa.

Dans la liste personnalisée pour construire le multidex, toutes les dépendances principales à Firebase, l'application elle-même et l'infrastructure, sont placées dans le fichier principal.

L'accident rapporté exprime cependant ceci:

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 

joignabilité vérifie l'état de la connexion et est utilisé à partir du noyau:

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> 

Si l'application est lancée en mode hors connexion, il est correctement détecté et procède à l'affichage des données attendues à partir du cache. La même chose se produit lorsque l'application est lancée et il y a connexion que les données sont affichées en temps réel à partir de Firebase. Soulignant, il échoue seulement quand la connexion changent à on ou off, selon l'état précédent.

Merci beaucoup, toute aide est la bienvenue.

Répondre

1

Impossible d'instancier récepteur com.developer.appname.Reachability: java.lang.ClassNotFoundException: Vous ne trouvez pas classe "com.developer.appname.Reachability"

Je reproduis votre problème et trouvé une solution. Comme dit SushiHangover, Xamarin auto-generates class ids if you do not specify one via an Attribute. Xamarin utilise Attributes dans le code pour remplir le Manifest lors de la construction. Here est le document sur la façon de créer un BraoadcastReceiver avec Attributes.

Lorsque vous utilisez Attributes pour votre BroadcastReceiver:

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

Enregistrez votre BroadcastReceiver:

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

Il fonctionne très bien.

+0

Merci @York Shen, votre conseil a été très utile. Cela et pendant la mise en œuvre de l'application, le service d'accessibilité est enregistré comme singleton, à utiliser à partir du noyau. Cependant, quand un OnReceive se produit, j'ai supposé qu'une autre copie du service est utilisée, différente de celle enregistrée dans la configuration. Sachant cela, la variable utilisée pour la classe Action requise dans Reachability, je l'ai déclarée statique et à partir de là, tout a bien fonctionné. – Helper