2017-06-30 16 views
0

世界のお仲間たちよ。私は助けが必要です。オン/オフラインで変更するとXamarin + Mvvmcross + Multidexがクラッシュする

私はMvvmcross 4.4とFirebaseを使ってXamarinでアプリケーションを開発しました。 Androidプロジェクトでは、私はmultidexを実装しなければなりませんでした。発生する問題は、アプリケーションが実行されていて接続が失われている(飛行機モード、WiFiオフなど)、またはその逆の場合です。

マルチデックスをビルドするカスタムリストでは、Firebaseの主な依存関係、アプリケーション自体、フレームワークはすべてメインファイルに置かれます。

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 

到達可能性は、接続の状態をチェックし、コアから使用されています:アプリケーションは、それが正しく検出されたオフライン打ち上げとされている場合は

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> 

が報告されたクラッシュは、しかし、この表現します予想されるデータをキャッシュから表示する。アプリが起動され、firebaseからリアルタイムでデータが表示される接続がある場合も同じことが起こります。 強調すると、前の状態に従って、接続がオンまたはオフに切り替わるときにのみ失敗します。

ありがとうございました。何卒よろしくお願いいたします。

答えて

1

受信com.developer.appname.Reachabilityをインスタンス化できません:にjava.lang.ClassNotFoundException:クラスが見つかりませんでした "com.developer.appname.Reachability" を

私はあなたの問題を再現しています解決策が見つかりました。 SushiHangoverが言ったように、Xamarin auto-generates class ids if you do not specify one via an Attribute。 Xamarinはコードの中にAttributesを使用して、ビルド時にManifestを記入します。 HereBraoadcastReceiverを作成する方法のドキュメントで、Attributesです。

あなたBroadcastReceiverためAttributesを使用します。

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

あなたBroadcastReceiverを登録します。

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

それは正常に動作します。

+0

ありがとう@ York Shen、あなたのアドバイスは非常に便利でした。それとアプリケーションの実装中に、到達可能性サービスはシングルトンとして登録され、コアから使用されます。 しかし、OnReceiveが発生すると、セットアップに登録されているものとは別のサービスの別のコピーが使用されていると想定しました。 Reachabilityクラス内で必要なActionに使用されている変数を知っているので、静的と宣言し、そこからすべてがうまくいきました。 – Helper

関連する問題