При вызове метода OnStart происходит сбой Akavache или Sqlite.
Когда я использую приведенный ниже код в своем проекте xamarin.forms, чтобы проверить, существует ли объект User в кэше akavache, я получаю исключение ниже. тот же код или любой запрос 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): в 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.761 E/MobileCenterCrashes( 6308): в Xamarin.Forms.Platform.Android.PlatformRenderer.OnLayout (System.Boolean изменено, System.Int32 l, System.Int32 t, System.Int32 r, System.Int32 b) [0x0000e] в D:\agent_work\1\s\Xamarin.Forms.Platform.Android\PlatformRenderer.cs:73 11-13 02:08:14.761 E/MobileCenterCrashes( 6308): на 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] в: 0
РЕДАКТИРОВАТЬ: Эта проблема определенно вызвана akavache. Сообщение действительно странное. похоже, что akavache имеет какое-то отношение к LayoutRootPage.
Посмотрите мой код выше, я получаю объект User из кэша akavache, и объект user определяет, нужно ли мне показывать страницу входа или главную страницу. Если я перееду ShowMainPageOrLoginPage();
Функция выше вызова акаваче, работает просто отлично. Таким образом, кажется, что вы не можете сделать любой запрос с помощью akavache до того, как rootlayoutpage - главная страница установлена или загружена.
1 ответ
У меня одна и та же проблема была однажды, по какой-то причине, если вы инициализируете статическим методом, он не работает постоянно.
Не работает
IBlobCache _cache = BlobCache.LocalMachine;
Работает
IBlobCache _cache = new SQLitePersistentBlobCache(systemPath + "/CacheUtils.db");
Если вы хотите найти systemPath, вы можете использовать его на вашем Android или iOS
systemPath = System.Environment.GetFolderPath(System.Environment.SpecialFolder.Personal);