c# - Xamarin Forms Android 应用程序在事件处理程序期间创建类对象后崩溃
问题描述
在我的登录页面中,每当我创建 User 的类对象(这是访问其属性所必需的)时,应用程序就会崩溃。
我的登录页面代码:
using System;
using System.Collections.Generic;
using System.Linq;
using WeatherApp.Models;
using Xamarin.Forms;
namespace WeatherApp
{
public partial class LoginPage : ContentPage
{
public LoginPage()
{
InitializeComponent();
}
async void Button_Clicked(System.Object sender, System.EventArgs e)
{
User user = new User();
//var username = Username.Text;
//var password = Password.Text;
//var _user = user.GetUser(username);
/*if (username == _user.Username && password == _user.Password)
{
user.Username = username;
user.Firstname = _user.Firstname;
await DisplayAlert("Log in successful", null, "OK");
await Navigation.PushAsync(new ProfilePage(user));
}
else
{
await DisplayAlert("Log in failed", $"No such combination with username: {username}", "Try again");
}*/
await DisplayAlert("Test OK", null, "OK");
}
}
}
用户类代码:
using System;
using System.Collections.Generic;
using System.Linq;
namespace WeatherApp.Models
{
public class User
{
public int Id { get; set; }
public string Username { get; set; }
public string Password { get; set; }
public string Firstname { get; set; }
public string Lastname { get; set; }
public List<User> _users = new List<User>
{
new User { Id = 1, Username = "user1", Password = "admin123", Firstname = "John", Lastname = "Doe" },
new User { Id = 2, Username = "user2", Password = "admin123", Firstname = "Eric", Lastname = "Johnsson"},
new User { Id = 3, Username = "user3", Password = "admin123", Firstname = "Elisabeth", Lastname = "Kant"}
};
public User GetUser(string username)
{
return _users.SingleOrDefault(u => u.Username == username);
}
}
}
我注释掉了根本不执行的代码片段,因为当我实例化 User 对象时应用程序已经崩溃。我认为用户对象实例化一定是问题,因为当我注释掉对象实例化时,“测试”DisplayAlert 工作得很好。这里另一个奇怪的元素是它以前可以工作,但突然停止工作。我的 VS 是最新的,我正在使用 Pie 9.0 - API 28 OS。构建输出显示以下错误(不确定是否与手头的问题有关):
Thread started: #9
[Mono] DllImport searching in: '__Internal' ('(null)').
[Mono] Searching for 'java_interop_jnienv_call_static_void_method_a'.
[Mono] Probing 'java_interop_jnienv_call_static_void_method_a'.
[Mono] Found as 'java_interop_jnienv_call_static_void_method_a'.
[] HostConnection::get() New Host Connection established 0xd0b49740, tid 8352
[ConfigStore] android::hardware::configstore::V1_0::ISurfaceFlingerConfigs::hasWideColorDisplay retrieved: 0
[ConfigStore] android::hardware::configstore::V1_0::ISurfaceFlingerConfigs::hasHDRDisplay retrieved: 0
[OpenGLRenderer] Initialized EGL, version 1.4
[OpenGLRenderer] Swap behavior 1
[OpenGLRenderer] Failed to choose config with EGL_SWAP_BEHAVIOR_PRESERVED, retrying without...
[OpenGLRenderer] Swap behavior 0
[EGL_emulation] eglCreateContext: 0xd1136580: maj 3 min 0 rcv 3
[EGL_emulation] eglMakeCurrent: 0xd1136580: ver 3 0 (tinfo 0xd0af1d60)
[Choreographer] Skipped 31 frames! The application may be doing too much work on its main thread.
[EGL_emulation] eglMakeCurrent: 0xd1136580: ver 3 0 (tinfo 0xd0af1d60)
[OpenGLRenderer] Davey! duration=847ms; Flags=0, IntendedVsync=4884011429238, Vsync=4884528095884, OldestInputEvent=9223372036854775807, NewestInputEvent=0, HandleInputStart=4884531739711, AnimationStart=4884531936711, PerformTraversalsStart=4884533006711, DrawStart=4884536005711, SyncQueued=4884760953711, SyncStart=4884764832711, IssueDrawCommandsStart=4884773311711, SwapBuffers=4884824837711, FrameCompleted=4884862621711, DequeueBufferDuration=734000, QueueBufferDuration=3630000,
[Mono] DllImport searching in: '__Internal' ('(null)').
[Mono] Searching for 'java_interop_jnienv_call_float_method_a'.
[Mono] Probing 'java_interop_jnienv_call_float_method_a'.
[Mono] Found as 'java_interop_jnienv_call_float_method_a'.
[Mono] Requesting loading reference 7 (of 11) of /storage/emulated/0/Android/data/com.companyname.weatherapp/files/.__override__/Xamarin.Android.Support.Fragment.dll
[Mono] Loading reference 7 of /storage/emulated/0/Android/data/com.companyname.weatherapp/files/.__override__/Xamarin.Android.Support.Fragment.dll asmctx DEFAULT, looking for Xamarin.Android.Arch.Lifecycle.LiveData.Core, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
[Mono] Assembly Ref addref Xamarin.Android.Support.Fragment[0xe885cfe0] -> Xamarin.Android.Arch.Lifecycle.LiveData.Core[0xe885c260]: 2
[Choreographer] Skipped 36 frames! The application may be doing too much work on its main thread.
[Mono] Requesting loading reference 7 (of 8) of /storage/emulated/0/Android/data/com.companyname.weatherapp/files/.__override__/WeatherApp.Android.dll
[Mono] Loading reference 7 of /storage/emulated/0/Android/data/com.companyname.weatherapp/files/.__override__/WeatherApp.Android.dll asmctx DEFAULT, looking for Xamarin.Forms.Platform, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null
[Mono] Assembly Ref addref WeatherApp.Android[0xe885ba80] -> Xamarin.Forms.Platform[0xe885de20]: 3
[OpenGLRenderer] Davey! duration=768ms; Flags=0, IntendedVsync=4891577757377, Vsync=4892177757353, OldestInputEvent=9223372036854775807, NewestInputEvent=0, HandleInputStart=4892194044711, AnimationStart=4892194119711, PerformTraversalsStart=4892195493711, DrawStart=4892336371711, SyncQueued=4892337359711, SyncStart=4892337854711, IssueDrawCommandsStart=4892338010711, SwapBuffers=4892338797711, FrameCompleted=4892346959711, DequeueBufferDuration=1586000, QueueBufferDuration=3761000,
[Choreographer] Skipped 30 frames! The application may be doing too much work on its main thread.
[libc] Fatal signal 11 (SIGSEGV), code 2 (SEGV_ACCERR), fault addr 0xff7d5f94 in tid 8292 (name.weatherapp), pid 8292 (name.weatherapp)
这是模拟器显示的错误:
解决这个问题真的会让我很开心,因为我已经为此苦苦挣扎了好几个小时。
解决方案
你需要从你的模型中创建一个UserService
单独的User
public class User
{
public int Id { get; set; }
public string Username { get; set; }
public string Password { get; set; }
public string Firstname { get; set; }
public string Lastname { get; set; }
}
public class UserService {
private List<User> _users = new List<User>
{
new User { Id = 1, Username = "user1", Password = "admin123", Firstname = "John", Lastname = "Doe" },
new User { Id = 2, Username = "user2", Password = "admin123", Firstname = "Eric", Lastname = "Johnsson"},
new User { Id = 3, Username = "user3", Password = "admin123", Firstname = "Elisabeth", Lastname = "Kant"}
};
public User GetUser(string username)
{
return _users.SingleOrDefault(u => u.Username == username);
}
}
那么您的点击处理程序将如下所示
async void Button_Clicked(System.Object sender, System.EventArgs e)
{
var svc = new UserService();
var username = Username.Text;
var password = Password.Text;
var _user = svc.GetUser(username);
if (_user != null && username == _user.Username && password == _user.Password)
{
await DisplayAlert("Log in successful", null, "OK");
await Navigation.PushAsync(new ProfilePage(_user));
}
else
{
await DisplayAlert("Log in failed", $"No such combination with username: {username}", "Try again");
}
await DisplayAlert("Test OK", null, "OK");
}
推荐阅读
- javascript - React:将状态存储到模板文字
- visual-studio-code - 尝试安装对 Python 的支持时出现 Visual Studio Code 错误
- jquery - 光滑的滑块在动态时仅显示一个点
- symfony - 在 \Doctrine\Common\Persistence 中找不到方法 getconnection
- c - 如何让我的 C 编辑器支持 Intellij 键盘映射?
- hibernate - “未能延迟初始化角色集合”
- json - SQL - UTF-8 到 varchar/nvarchar 编码问题
- react-native - React-Native Expo & loadassetasync()
- angular - Angular 应用程序中的动态 routerLink 未返回正确结果
- php - 无法访问 Strava API oAuth 进程令牌交换页面