在OnStart方法

时间:2017-11-13 01:26:28

标签: xamarin.forms xamarin.android akavache mobile-center visual-studio-app-center

当我在我的xamarin.forms项目中使用下面的代码来检查akavache缓存中是否存在User对象时,我得到以下异常。相同的代码或任何akavache查询在其他地方工作,但仅在onStart方法中崩溃。我相信我已经在构造函数中初始化akavache了。我尝试使用移动中心完全相同的代码来查询本地(本地sqlite)用户数据,我得到相同的异常。我认为这应该与sqlite有关,因为akavache和移动中心都使用类似的sqlite库。有人知道为什么它在OnStart方法中不起作用吗?

 public App()
        {
            Microsoft.Azure.Mobile.MobileCenter.Start("android=key" +
                   "uwp=key",
                   typeof(Microsoft.Azure.Mobile.Analytics.Analytics), typeof(Microsoft.Azure.Mobile.Crashes.Crashes));

            Akavache.BlobCache.ApplicationName = "myApp";
            Akavache.BlobCache.EnsureInitialized();

            ServiceLocator.Add<ICloudService, AzureCloudService>();

            InitializeComponent();

            }

  protected async override void OnStart()
        { 

            try
            {
               var User= await BlobCache.UserAccount.GetObject<User>("User");

                if (User != null)
                    Helpers.Settings.IsLoggedIn = true;
                else
                    Helpers.Settings.IsLoggedIn = false;
            }
            catch (Exception)
            {
                Helpers.Settings.IsLoggedIn = false;
            }
           ShowMainPageOrLoginPage();
        }
  

11-13 02:08:14.761 E / MobileCenterCrashes(6308):未处理的异常:   11-13 02:08:14.761 E / MobileCenterCrashes(6308):   System.NullReferenceException:未将对象引用设置为实例   一个对象。 11-13 02:08:14.761 E / MobileCenterCrashes(6308):at   Xamarin.Forms.Platform.Android.AppCompat.Platform.LayoutRootPage   (Xamarin.Forms.Page页面,System.Int32宽度,System.Int32高度)   [0x0000c] in   d:\ agent_work \ 1 \ S \ Xamarin.Forms.Platform.Android \程序兼容性\ Platform.cs:291   11-13 02:08:14.761 E / MobileCenterCrashes(6308):at   Xamarin.Forms.Platform.Android.AppCompat.Platform.Xamarin.Forms.Platform.Android.IPlatformLayout.OnLayout   (System.Boolean已更改,System.Int32 l,System.Int32 t,System.Int32   r,System.Int32 b)[0x00003] in   d:\ agent_work \ 1 \ S \ Xamarin.Forms.Platform.Android \程序兼容性\ Platform.cs:199   11-13 02:08:14.761 E / MobileCenterCrashes(6308):at   Xamarin.Forms.Platform.Android.PlatformRenderer.OnLayout   (System.Boolean已更改,System.Int32 l,System.Int32 t,System.Int32   r,System.Int32 b)[0x0000e] in   d:\ agent_work \ 1 \ S \ Xamarin.Forms.Platform.Android \ PlatformRenderer.cs:73   11-13 02:08:14.761 E / MobileCenterCrashes(6308):at   Android.Views.ViewGroup.n_OnLayout_ZIIII(System.IntPtr jnienv,   System.IntPtr native__this,System.Boolean已更改,System.Int32 l,   System.Int32 t,System.Int32 r,System.Int32 b)[0x00008] in   :0

编辑: 这个问题肯定是由akavache造成的。消息真的很奇怪。看起来akavache与LayoutRootPage有一些关系。

请参阅上面的代码,我从akavache缓存获取User对象,用户对象定义是否应显示Login Page或Main Page。如果我将ShowMainPageOrLoginPage();函数移到akavache调用之上,它就可以了。因此,似乎您无法在rootlayoutpage之前使用akavache进行任何查询 - 设置或加载主页面。

1 个答案:

答案 0 :(得分:1)

之前我遇到过同样的问题,出于某种原因,如果你使用静态方法进行初始化,它不会一直工作。

不能工作

IBlobCache _cache = BlobCache.LocalMachine;

工作

IBlobCache _cache = new SQLitePersistentBlobCache(systemPath + "/CacheUtils.db");

如果您想找到systemPath,可以在Android或iOS中使用它

systemPath = System.Environment.GetFolderPath(System.Environment.SpecialFolder.Personal);