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

Posted

技术标签:

【中文标题】在 Xamarin.Android 中将 Json 对象项中的错误值保存和检索到 IShared 首选项(始终返回注销值)【英文标题】:Save and retrieve Wrong Value From Json Object Items to IShared Preference in Xamarin.Android (Always Returns Logout Value) 【发布时间】:2020-10-05 01:15:17 【问题描述】:

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

到目前为止,我可以从我的 Web 服务中解析 Json 对象并将它们分配给变量。但是,我发现了一些奇怪的事情,我解析的 json 对象项无法保存在我的共享首选项中。我已经在互联网上搜索和研究了 3 天,但我没有找到任何东西。我几乎放弃了,伙计们。你愿意帮助我吗?我会很感激帮助。

这是我对我的应用所做的。

我制作了实用程序文件夹来保存我的必需品课程。我现在制作了 LoginSession 类来保存用户的属性。

我的主要活动中

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();
            

然后我使用SharedPref.UserIDNow 检索下一个活动中的值以检索用户 ID。我将 SharedPref.UserIDNow 放入我的静态函数中以获取当前用户 ID

我错过了什么?每次我启动并登录时,登录后应用程序都会像注销一样关闭!并且值返回-22。顺便说一句,-22 是我共享偏好的默认值。我认为它必须是用户的ID。请帮帮我:(

【问题讨论】:

【参考方案1】:

我用你的代码测试过,没问题。

一些故障排除建议。

    调试代码(添加断点)以检查SharedPref.UserIDNow= userID; 是否已执行,同时删除RunOnUiThread 方法,除非UI 元素发生更改,否则无需将代码包装到其中。

    使用默认SharedPreferences,将preference改为

    private static ISharedPreferences preference = PreferenceManager.GetDefaultSharedPreferences(Application.Context);
    

    ISharedPreferencesEditor 上使用Commit 而不是Apply 方法,Apply 是异步方法,这意味着如果您过早读取值,您将获得当时的默认值。

【讨论】:

以上是关于在 Xamarin.Android 中将 Json 对象项中的错误值保存和检索到 IShared 首选项(始终返回注销值)的主要内容,如果未能解决你的问题,请参考以下文章

在Xamarin.Android中将Keycode转换为char

如何在xamarin android中将位图图像转换为gif?

无法在 Xamarin Android 中将图像从资源设置为自定义 ImageView?

在 Xamarin.Android 中解析 json 请求

解码 JSON Web 令牌 (Xamarin.Android)

使用 xamarin android 解析 json