【发布时间】:2019-06-30 19:26:14
【问题描述】:
我刚刚开始在我的 Xamarin Android 和 iOS 项目中使用 ReactiveUI。我注意到我使用 ReactiveUI 的 Android 片段最初需要很长时间才能加载。例如,在我的应用程序中第一次调用 ReactiveCommand.Create 时,大约需要 250 毫秒。第一次调用 OneWayBind、WhenAny、BindCommand 时类似的事情。但是,如果我再次重新实例化视图和视图模型,这些方法几乎会立即返回(
public ReactiveCommand<Unit, Unit> ButtonCommand { get; }
System.Diagnostics.Stopwatch sw = new System.Diagnostics.Stopwatch();
sw.Start();
ButtonCommand = ReactiveCommand.Create(() => Console.WriteLine("test"));
long test = sw.ElapsedMilliseconds;
Console.WriteLine(test);
为了解决这个问题,我在启动初始屏幕期间从主线程随机调用了 ReactiveUI API。我是否遗漏了文档中遗漏的 ReactiveUI 初始化步骤?还有其他人有这个问题吗?这是在安卓上,我还没试过iOS。
更新 感谢格伦的回复,你是对的。我会尝试调查我的项目设置是否正确。视图模型位于具有 ReactiveUI 和 Fody 包引用的 .NET Standard 2.0 项目中。我的 Android 项目和 Android 库有 ReactiveUI 和 RxUI.AndroidSupport。以下是调用 ReactiveCommand.Create 时的日志。不知道为什么它甚至会探测 WinForm、WPF、XamForms...
06-30 17:39:39.178 I/mono-stdout(28083): XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX - start
06-30 17:39:39.222 D/Mono (28083): Loading reference 1 of System.Core.dll asmctx DEFAULT, looking for System, Version=2.0.5.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e
06-30 17:39:39.222 D/Mono (28083): Assembly Ref addref System.Core[0x7c76e09880] -> System[0x7c76dbbf80]: 8
06-30 17:39:39.239 D/Mono (28083): Loading reference 0 of /storage/emulated/0/Android/data/com.philips.CareTouch.B00/files/.__override__/Splat.dll asmctx DEFAULT, looking for mscorlib, Version=2.0.5.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e
06-30 17:39:39.239 D/Mono (28083): Assembly Ref addref Splat[0x7cd15ab900] -> mscorlib[0x7cd15a1480]: 29
06-30 17:39:39.244 D/Mono (28083): Loading reference 4 of /storage/emulated/0/Android/data/com.philips.CareTouch.B00/files/.__override__/Splat.dll asmctx DEFAULT, looking for System.Core, Version=2.0.5.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e
06-30 17:39:39.244 D/Mono (28083): Assembly Ref addref Splat[0x7cd15ab900] -> System.Core[0x7c76e09880]: 6
06-30 17:39:39.284 D/Mono (28083): Loading reference 3 of /storage/emulated/0/Android/data/com.philips.CareTouch.B00/files/.__override__/ReactiveUI.dll asmctx DEFAULT, looking for System.Core, Version=2.0.5.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e
06-30 17:39:39.284 D/Mono (28083): Assembly Ref addref ReactiveUI[0x7cd15ab600] -> System.Core[0x7c76e09880]: 7
06-30 17:39:39.287 D/Mono (28083): Loading reference 2 of /storage/emulated/0/Android/data/com.philips.CareTouch.B00/files/.__override__/Splat.dll asmctx DEFAULT, looking for System, Version=2.0.5.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e
06-30 17:39:39.287 D/Mono (28083): Assembly Ref addref Splat[0x7cd15ab900] -> System[0x7c76dbbf80]: 9
06-30 17:39:39.294 D/Mono (28083): Loading reference 7 of /storage/emulated/0/Android/data/com.philips.CareTouch.B00/files/.__override__/ReactiveUI.dll asmctx DEFAULT, looking for Mono.Android, Version=0.0.0.0, Culture=neutral, PublicKeyToken=84e04ff9cfb79065
06-30 17:39:39.294 D/Mono (28083): Assembly Ref addref ReactiveUI[0x7cd15ab600] -> Mono.Android[0x7c76dbbd00]: 17
06-30 17:39:39.347 D/Mono (28083): DllImport searching in: '__Internal' ('(null)').
06-30 17:39:39.347 D/Mono (28083): Searching for 'java_interop_jnienv_call_long_method_a'.
06-30 17:39:39.347 D/Mono (28083): Probing 'java_interop_jnienv_call_long_method_a'.
06-30 17:39:39.347 D/Mono (28083): Found as 'java_interop_jnienv_call_long_method_a'.
06-30 17:39:39.360 D/Mono (28083): Assembly Loader probing location: '/Users/builder/jenkins/workspace/xamarin-android-d16-1/xamarin-android/external/mono/sdks/out/android-arm64-v8a-release/lib/ReactiveUI.XamForms.dll'.
06-30 17:39:39.360 D/Mono (28083): Assembly Loader probing location: '/Users/builder/jenkins/workspace/xamarin-android-d16-1/xamarin-android/external/mono/sdks/out/android-arm64-v8a-release/lib/ReactiveUI.XamForms.exe'.
06-30 17:39:39.366 D/Mono (28083): Assembly Loader probing location: '/Users/builder/jenkins/workspace/xamarin-android-d16-1/xamarin-android/external/mono/sdks/out/android-arm64-v8a-release/lib/ReactiveUI.Winforms.dll'.
06-30 17:39:39.366 D/Mono (28083): Assembly Loader probing location: '/Users/builder/jenkins/workspace/xamarin-android-d16-1/xamarin-android/external/mono/sdks/out/android-arm64-v8a-release/lib/ReactiveUI.Winforms.exe'.
06-30 17:39:39.367 D/Mono (28083): Assembly Loader probing location: '/Users/builder/jenkins/workspace/xamarin-android-d16-1/xamarin-android/external/mono/sdks/out/android-arm64-v8a-release/lib/ReactiveUI.Wpf.dll'.
06-30 17:39:39.367 D/Mono (28083): Assembly Loader probing location: '/Users/builder/jenkins/workspace/xamarin-android-d16-1/xamarin-android/external/mono/sdks/out/android-arm64-v8a-release/lib/ReactiveUI.Wpf.exe'.
06-30 17:39:39.368 D/Mono (28083): Assembly Loader probing location: '/Users/builder/jenkins/workspace/xamarin-android-d16-1/xamarin-android/external/mono/sdks/out/android-arm64-v8a-release/lib/ReactiveUI.Uno.dll'.
06-30 17:39:39.368 D/Mono (28083): Assembly Loader probing location: '/Users/builder/jenkins/workspace/xamarin-android-d16-1/xamarin-android/external/mono/sdks/out/android-arm64-v8a-release/lib/ReactiveUI.Uno.exe'.
06-30 17:39:39.489 I/mono-stdout(28083): XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX - end
06-30 17:39:39.490 I/mono-stdout(28083): Elapsed 323
【问题讨论】:
-
我很怀疑它会加载 DLL。
-
winforms, wpf 是由于 rxui 尝试加载依赖 DLL 的方式。它有一个 DLL 列表,它会尝试在这些 DLL 中加载和运行注册(如果存在)。大多数情况下,我们在 nuget 包中搜索已知的 DLL。
标签: xamarin.android reactive-programming reactiveui