C# 将Json对象项中的错误值保存并检索到Xamarin.Android中的IShared首选项(始终返回注销值)
我正在开发一个登录应用程序,它使用Xamarin Android(C#)中的共享首选项保存用户名和密码。首先,我从web服务获取用户名和密码值,然后检查值。如果我的本地数据库(sqlite)中没有该值,那么我将使用web服务中的最新数据更新数据。之后,我使用我的定制sqlite函数存储用户ID,以获得带有用户名和密码的用户ID 到目前为止,我可以从web服务解析Json对象并将它们分配到变量中。但是,我发现一些奇怪的事情,我解析的json对象项不能保存在我的共享首选项中。我已经在网上搜索了3天了,但什么也没找到。我几乎要放弃了,伙计们。你愿意帮我吗?我会感谢你的帮助 这里是我对我的应用程序所做的 我制作了一个实用工具文件夹来保存我的essentials类。我制作了登录会话类,现在保存用户的属性 在我的主要活动中C# 将Json对象项中的错误值保存并检索到Xamarin.Android中的IShared首选项(始终返回注销值),c#,android,json,xamarin,xamarin.android,C#,Android,Json,Xamarin,Xamarin.android,我正在开发一个登录应用程序,它使用Xamarin Android(C#)中的共享首选项保存用户名和密码。首先,我从web服务获取用户名和密码值,然后检查值。如果我的本地数据库(sqlite)中没有该值,那么我将使用web服务中的最新数据更新数据。之后,我使用我的定制sqlite函数存储用户ID,以获得带有用户名和密码的用户ID 到目前为止,我可以从web服务解析Json对象并将它们分配到变量中。但是,我发现一些奇怪的事情,我解析的json对象项不能保存在我的共享首选项中。我已经在网上搜索了3天了
private void MyBtnLogin(object aSender, System.EventArgs e)
{
try
{
System.Net.Http.HttpClient client= new System.Net.Http.HttpClient();
System.Threading.Tasks.Task.Run(async () =>
{
string response = await _httpClient.GetStringAsync($"http://yourjson.com/{fix_email_value}");
JObject parsedObject = JObject.Parse(response);
int userID = parsedObject .Value<int>("ID");
string userEmail = _parsedResponseObject.Value<string>("Email");
string userPassword = _parsedResponseObject.Value<string>("Password");
List<User> lists= User.GetUserList(userID);
User updatedvalue= (from a in lists where a.Email == userEmail && a.Password == userPassword select a).FirstOrDefault();
if (updatedvalue== null)
{
updatedvalue= new User();
updatedvalue.ID = userID;
updatedvalue.Email = userEmail;
updatedvalue.Password = userPassword;
updatedvalue.StoreOrChange();
RunOnUiThread(() =>
{
SharedPref.UserIDNow= userID;
LoginSession.UserNow= User.GetID(userID);
});
} }
});
StartActivity(typeof(NextPage));
Finish();
}
private void MyBtnLogin(对象aSender,System.EventArgs e)
{
尝试
{
System.Net.Http.HttpClient client=新系统.Net.Http.HttpClient();
System.Threading.Tasks.Task.Run(异步()=>
{
string response=await\u httpClient.GetStringAsync($)http://yourjson.com/{fix_email_value}”);
JObject parsedObject=JObject.Parse(响应);
int userID=parsedObject.Value(“ID”);
字符串userEmail=_parsedResponseObject.Value(“电子邮件”);
字符串userPassword=_parsedResponseObject.Value(“密码”);
List List=User.GetUserList(userID);
User updatedvalue=(从列表中的a开始,其中a.Email==userEmail&&a.Password==userPassword选择a);
if(updatedvalue==null)
{
updatedvalue=新用户();
updatedvalue.ID=用户ID;
updatedvalue.Email=userEmail;
updatedvalue.Password=userPassword;
updatedvalue.StoreOrChange();
RunOnUiThread(()=>
{
SharedPref.UserIDNow=userID;
LoginSession.UserNow=User.GetID(userID);
});
} }
});
起始触觉(类型(下一页));
完成();
}
我在下一个活动中使用SharedRef.UserIDNow
检索用户ID来检索值。我将SharedRef.UserIDNow
放在静态函数中以获取当前用户ID
我错过了什么?每次当我启动并登录时,登录后应用程序会像注销一样关闭!值返回-22。顺便说一句,-22是我共享首选项的默认值。我想它一定是用户的ID。请帮助我:(我使用您的代码进行测试,它可以正常工作 一些故障排除建议
SharedRef.UserIDNow=userID;
,并删除RunOnUiThread
方法,除非UI元素发生更改,否则不需要将代码包装到其中SharedReferences
,将首选项更改为
private static ISharedPreferences preference = PreferenceManager.GetDefaultSharedPreferences(Application.Context);
iSharedReferencesEditor
上使用Commit
而不是Apply
方法,Apply
是一种异步方法,这意味着如果您过早读取值,您将在该时间获得默认值