C# 将Json对象项中的错误值保存并检索到Xamarin.Android中的IShared首选项(始终返回注销值)

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天了

我正在开发一个登录应用程序,它使用Xamarin Android(C#)中的共享首选项保存用户名和密码。首先,我从web服务获取用户名和密码值,然后检查值。如果我的本地数据库(sqlite)中没有该值,那么我将使用web服务中的最新数据更新数据。之后,我使用我的定制sqlite函数存储用户ID,以获得带有用户名和密码的用户ID

到目前为止,我可以从web服务解析Json对象并将它们分配到变量中。但是,我发现一些奇怪的事情,我解析的json对象项不能保存在我的共享首选项中。我已经在网上搜索了3天了,但什么也没找到。我几乎要放弃了,伙计们。你愿意帮我吗?我会感谢你的帮助

这里是我对我的应用程序所做的

我制作了一个实用工具文件夹来保存我的essentials类。我制作了登录会话类,现在保存用户的属性

在我的主要活动中

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
    是一种异步方法,这意味着如果您过早读取值,您将在该时间获得默认值