【问题标题】:Xamarin + Mvvmcross + Multidex crash when change on/offlineXamarin + Mvvmcross + Multidex 在更改开/脱机时崩溃
【发布时间】:2017-07-03 15:47:51
【问题描述】:

问候来自世界 xamarin 的同事。我需要帮助。

我使用 Mvvmcross 4.4 和 Firebase 在 Xamarin 中开发了一个应用程序。在 Android 项目中,我必须实现 multidex。发生的问题是应用程序正在运行并且连接丢失(飞行模式、wifi 关闭等)或反之亦然。

在构建 multidex 的自定义列表中,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实时显示数据的连接时,也会发生同样的情况。 强调一下,根据之前的状态,只有连接开启或关闭时才会失败。

非常感谢,欢迎任何帮助。

【问题讨论】:

    标签: android xamarin mvvmcross reachability android-multidex


    【解决方案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 在构建时填写ManifestHere 是关于如何使用Attributes 创建BraoadcastReceiver 的文档。

    当您将Attributes 用作您的BroadcastReceiver 时:

    [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));
    

    效果很好。

    【讨论】:

    • 感谢@York Shen,您的建议非常有用。在应用程序的实现过程中,可达性服务被注册为单例,以便从核心使用。但是,当 OnReceive 发生时,我假设使用了该服务的另一个副本,与设置中注册的副本不同。知道了这一点,在 Reachability 类中用于所需 Action 的变量,我将它声明为静态的,从那里开始,一切都运行良好。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-06
    • 1970-01-01
    相关资源
    最近更新 更多