- public class App : MvxApplication
- {
- public override void Initialize()
- {
- MPS.ApplicationName = Settings.ApplicationName;
- EventLog.ApplicationName = Settings.ApplicationName;
- BlobCache.ApplicationName = Settings.ApplicationName;
- CreatableTypes()
- .EndingWith("Service")
- .AsInterfaces()
- .RegisterAsLazySingleton();
- CreatableTypes()
- .EndingWith("Singleton")
- .AsInterfaces()
- .RegisterAsSingleton();
- //RegisterAppStart(new CustomAppStart());
- //RegisterNavigationServiceAppStart<Loginviewmodel>();
- RegisterAppStart<Loginviewmodel>();
- }
- }
这是非常基本的.我已经转换为新的导航系统因此RegisterNavigationServiceAppStart.那将不再解决,所以我回到了直接的RegisterAppStart.启动画面出现然后停止.如果重要,splashscreen.cs如下:
- [Activity(
- Label = "@string/ApplicationName",MainLauncher = true,Icon = "@drawable/icon",Theme = "@style/Theme.Splash",NoHistory = true)]
- //,ScreenOrientation = ScreenOrientation.Landscape)]
- public class SplashScreen : MvxSplashScreenActivity
- {
- public SplashScreen()
- : base(Resource.Layout.SplashScreen)
- {
- }
- }
这很香草,但我知道事情已经发生了变化.我的setup.cs如下:
- public class Setup : MvxAndroidSetup
- {
- //public Setup(Context applicationContext)
- // : base(applicationContext)
- //{
- //}
- protected override IMvxApplication CreateApp()
- {
- return new App();
- }
- //protected override IMvxTrace CreateDebugTrace()
- //{
- // return new DebugTrace();
- //}
- protected override IMvxAndroidViewPresenter CreateViewPresenter()
- {
- return new MvxAppCompatViewPresenter(AndroidViewAssemblies);
- }
- protected override void FillValueConverters(IMvxValueConverterRegistry registry)
- {
- base.FillValueConverters(registry);
- registry.AddOrOverwrite("DateToStringConverter",new DateToStringConverter());
- registry.AddOrOverwrite("FloatToStringConverter",new FloatToStringConverter());
- registry.AddOrOverwrite("DecimalToStringConverter",new DecimalToStringConverter());
- registry.AddOrOverwrite("BoolToViewStatesConverter",new BoolToViewStatesValueConverter());
- registry.AddOrOverwrite("ShipmentToOriginConverter",new ShipmentToOriginConverter());
- registry.AddOrOverwrite("ShipmentToDestinationConverter",new ShipmentToDestinationConverter());
- //registry.AddOrOverwrite("CustomName2",new AnotherVerySpecialValueConverter("Summer"));
- }
- protected override void FillTargetFactories(MvvmCross.Binding.Bindings.Target.Construction.IMvxTargetBindingFactoryRegistry registry)
- {
- base.FillTargetFactories(registry);
- registry.RegisterCustomBindingFactory<EditText>("FocusText",textView => new MvxEditTextFocusBinding(textView));
- registry.RegisterCustomBindingFactory<TextView>("FocusChange",textView => new MvxTextViewFocusChangeBinding(textView));
- //registry.RegisterCustomBindingFactory<MvxSpinner>("ItemSelected",// spinner => new MvxSpinnerItemSelectedBinding(spinner));
- }
- protected override IEnumerable<Assembly> AndroidViewAssemblies => new List<Assembly>(base.AndroidViewAssemblies)
- {
- typeof(MvvmCross.Droid.Support.V7.RecyclerView.MvxRecyclerView).Assembly
- };
- }
我对它做的唯一改变是删除构造函数.根据6.0版的文档,构造函数不再有参数,所以我没有理由调用它.有人可以帮忙吗?
**更新**
我添加了一个MainApplication.cs,如下所示:
- [Application]
- public class MainApplication : MvxAppCompatApplication<Setup,App>
- {
- public MainApplication(IntPtr javaReference,JniHandleOwnership transfer) : base(javaReference,transfer)
- {
- }
- }
这让我超越了启动画面,但挂起了Loginviewmodel的Initialize.
*日志*
也许这会有所帮助.以下是事件日志条目:
- 2018-04-17 12:17:06 [TRACE] (MvvmCross.Core.MvxSetup) Setup: Primary start
- 2018-04-17 12:17:06 [TRACE] (MvvmCross.Core.MvxSetup) Setup: FirstChance start
- 2018-04-17 12:17:06 [TRACE] (MvvmCross.Core.MvxSetup) Setup: PlatformServices start
- 2018-04-17 12:17:06 [TRACE] (MvvmCross.Core.MvxSetup) Setup: MvvmCross settings start
- 2018-04-17 12:17:06 [TRACE] (MvvmCross.Core.MvxSetup) Setup: Singleton Cache start
- 2018-04-17 12:17:06 [TRACE] (MvvmCross.Core.MvxSetup) Setup: ViewDispatcher start
- 2018-04-17 12:17:06 [TRACE] (MvvmCross.Core.MvxSetup) Setup: Bootstrap actions
- 2018-04-17 12:17:07 [TRACE] (MvvmCross.Logging.MvxLog) No view model type finder available - assuming we are looking for a splash screen - returning null
- 2018-04-17 12:17:07 [TRACE] (MvvmCross.Core.MvxSetup) Setup: StringToTypeParser start
- 2018-04-17 12:17:07 [TRACE] (MvvmCross.Core.MvxSetup) Setup: CommandHelper start
- 2018-04-17 12:17:07 [TRACE] (MvvmCross.Core.MvxSetup) Setup: PluginManagerFramework start
- 2018-04-17 12:17:07 [TRACE] (MvvmCross.Core.MvxSetup) Setup: Create App
- 2018-04-17 12:17:07 [TRACE] (MvvmCross.Core.MvxSetup) Setup: NavigationService
- 2018-04-17 12:17:07 [TRACE] (MvvmCross.Core.MvxSetup) Setup: Load navigation routes
- 2018-04-17 12:17:07 [TRACE] (MvvmCross.Core.MvxSetup) Setup: App start
- 2018-04-17 12:17:07 [TRACE] (MvvmCross.Core.MvxSetup) Setup: Application Initialize - On background thread
- 2018-04-17 12:17:08 [TRACE] (MvvmCross.Core.MvxSetup) Setup: viewmodelTypeFinder start
- 2018-04-17 12:17:08 [TRACE] (MvvmCross.Core.MvxSetup) Setup: ViewsContainer start
- 2018-04-17 12:17:08 [TRACE] (MvvmCross.Core.MvxSetup) Setup: Views start
- 2018-04-17 12:17:08 [TRACE] (MvvmCross.Core.MvxSetup) Setup: CommandCollectionBuilder start
- 2018-04-17 12:17:08 [TRACE] (MvvmCross.Core.MvxSetup) Setup: NavigationSerializer start
- 2018-04-17 12:17:08 [TRACE] (MvvmCross.Core.MvxSetup) Setup: InpcInterception start
- 2018-04-17 12:17:08 [TRACE] (MvvmCross.Core.MvxSetup) Setup: InpcInterception start
- 2018-04-17 12:17:08 [TRACE] (MvvmCross.Core.MvxSetup) Setup: LastChance start
- 2018-04-17 12:17:08 [TRACE] (MvvmCross.Core.MvxSetup) Setup: Secondary end
- 2018-04-17 12:17:08 [TRACE] (MvvmCross.Logging.MvxLog) AppStart: Application Startup - On UI thread
我进一步追踪它.它挂在视图模型中的Initialize()上.我创建了一个测试来演示:
如果我在两个var m = l上设置一个断点,它将到达构造函数中的断点,但永远不会到达Initialize中的断点. GetLocations是:
- public async static Task<LocationList> GetLocations()
- {
- ListServiceClient client = NewClient();
- LocationList ret = null;
- bool TryCache = false;
- try
- {
- //ret = await client.GetLocationListAsync();
- ret = await Task<LocationList>.Factory.FromAsync((asyncCallback,asyncState) => client.BeginGetLocationList(asyncCallback,asyncState),(asyncResult) => client.EndGetLocationList(asyncResult),null);
- client.Close();
- await BlobCache.LocalMachine.InsertObject("Locations",ret,DateTimeOffset.Now.AddDays(Settings.CacheDays));
- }
- catch (TimeoutException ex)
- {
- client.Abort();
- EventLog.Error(ex.ToString());
- TryCache = true;
- }
- catch (CommunicationException ex)
- {
- client.Abort();
- EventLog.Error(ex.ToString());
- TryCache = true;
- }
- catch (Exception ex)
- {
- EventLog.Error(ex.ToString());
- TryCache = true;
- }
- if (TryCache)
- {
- try
- {
- ret = await BlobCache.LocalMachine.GetObject<LocationList>("Locations");
- }
- catch (KeyNotFoundException)
- {
- ret = null;
- }
- }
- return ret;
- }
如果在Client.Close()上设置一个断点,如果从构造函数调用它,它将到达那里,但如果从Initialize调用则不会.
解决方法
- [Application]
- public class MainApplication : MvxAppCompatApplication<Setup,transfer)
- {
- }
- }
如果没有这个,你将被困在SplashScreen上.其次,您需要知道您显示的第一个viewmodel中的Initialize必须是同步的.正如@Ale_lipa所提到的,一位MvvmCross作者撰写了一篇博客文章,解释了为什么会这样做以及如何处理它.
简而言之,如果您使用的是SplashScreen,并且您确实需要将第一个viewmodel的Initialize作为Async,则可以按如下方式添加CustomAppStart:
- public class CustomMvxAppStart<Tviewmodel> : MvxAppStart<Tviewmodel>
- where Tviewmodel : IMvxviewmodel
- {
- public CustomMvxAppStart(IMvxApplication application,IMvxNavigationService navigationService) : base(application,navigationService)
- {
- }
- protected override void NavigateToFirstviewmodel(object hint)
- {
- NavigationService.Navigate<Tviewmodel>();
- }
- }
在你的App.cs中,替换你的:
- RegisterAppStart<Firstviewmodel>();
有:
- RegisterCustomAppStart<CustomMvxAppStart<Firstviewmodel>>();
这将允许您的第一个Initialize异步.我只确定它适用于Android,并且只有在使用SplashScreen时才有效.