1

当我在我的 xamarin.forms 项目中使用下面的代码来检查 akavache 缓存中是否存在 User 对象时,我得到了下面的异常。相同的代码或任何 akavache 查询在其他地方工作,但仅在 onStart 方法中崩溃。我相信我已经在构造函数中初始化了 akavache。我使用移动中心尝试了完全相同的代码来查询本地(本地 sqlite)用户数据,我得到了同样的异常。我认为这应该与 sqlite 有关,因为 akavache 和 mobile center 都使用类似的 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):在 Xamarin.Forms.Platform.Android.AppCompat.Platform.LayoutRootPage(Xamarin.Forms.Page 页面,System.Int32 宽度,System.Int32 高度)[0x0000c]在 D:\agent_work\1\s\Xamarin.Forms.Platform.Android\AppCompat\Platform.cs:291 11-13 02:08:14.761 E/MobileCenterCrashes(6308): 在 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] 在 D:\agent_work\1 \s\Xamarin.Forms.Platform.Android\AppCompat\Platform.cs:199 11-13 02:08:14。

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

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

4

1 回答 1

1

我以前遇到过同样的问题,由于某种原因,如果您使用静态方法进行初始化,它并不总是有效。

不工作

IBlobCache _cache = BlobCache.LocalMachine;

有用吗

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

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

systemPath = System.Environment.GetFolderPath(System.Environment.SpecialFolder.Personal);
于 2017-11-13T03:58:45.567 回答