当我在我的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进行任何查询 - 设置或加载主页面。
答案 0 :(得分:1)
之前我遇到过同样的问题,出于某种原因,如果你使用静态方法进行初始化,它不会一直工作。
不能工作
IBlobCache _cache = BlobCache.LocalMachine;
工作
IBlobCache _cache = new SQLitePersistentBlobCache(systemPath + "/CacheUtils.db");
如果您想找到systemPath,可以在Android或iOS中使用它
systemPath = System.Environment.GetFolderPath(System.Environment.SpecialFolder.Personal);