【问题标题】:Object is not being saved in the shared Preferences对象未保存在共享首选项中
【发布时间】:2017-12-02 01:40:12
【问题描述】:

我正在使用带有retrofit2.0 的rest 来处理android 项目中对象的更新细节。在我调用编辑方法后,我得到一个肯定的响应,我的更改正在保存,但是在将它保存在共享首选项中并尝试从中获取它时,我得到了旧的未更改数据并在数据库中检查它的旧数据(休息服务工作得很好,我用邮递员测试过)。

这是我的代码:

           public void editUser(){
    user.setNom(nom);
    user.setPrenom(prenom);
    user.setAdresse(adresse);
    user.setTel(telephone);
    apiService = RestService.createService(SolarAPIService.class);
    Call<String> call = apiService.editUser(nom,prenom,adresse,telephone,user.getIdUser());
    call.enqueue(new Callback<String>() {
        @Override
        public void onResponse(Call<String> call, Response<String> response) {
            if(response.body().isEmpty()){
                Snackbar.make(layout, "OOps modification non autorisée !", Snackbar.LENGTH_LONG).show();
            }else{
                save(user);

            }
        }

        @Override
        public void onFailure(Call<String> call, Throwable t) {
            Snackbar.make(layout, "OOps!!!!!", Snackbar.LENGTH_LONG).show();
        }
    });

}

这是调用编辑的地方

              valider.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
                editUser();

            phoneView.setText(""+user.getTel());
            adrView.setText(user.getAdresse());
            nomV.setText(user.getNom()+" "+user.getPrenom());
            mailV.setText(user.getLogin());
            getUserShrdPref();
            Snackbar.make(layout, "Changement effectué avec sucess !!"+user.getAdresse(), Snackbar.LENGTH_LONG).show();


        }
    });

这是保存和getSharedPrefernces

         public void save(User user) {
    mPrefs = getPreferences(MODE_PRIVATE);
    SharedPreferences.Editor prefsEditor = mPrefs.edit();
    Gson gson = new Gson();
    String json = gson.toJson(user);
    prefsEditor.putString("user", json);
    prefsEditor.commit();
}

     public void getUserShrdPref() {
    Gson gson = new Gson();
    String json = mPrefs.getString("user", "");
    user = gson.fromJson(json, User.class);
}

问题是根本没有异常或崩溃,我无法弄清楚错误。

【问题讨论】:

  • 您好,您是否尝试过使用 prefsEditor.apply();而不是 prefsEditor.commit();我在使用改造时使用应用。
  • 显示getPreferences方法
  • 它的 getUserShrdPref() 方法
  • 可能是竞争条件。 nom、prenom、address 等在哪里设置?
  • @MeknessiHamida 向我们展示editUser 方法。

标签: android sharedpreferences gson


【解决方案1】:

可能是竞争条件。检查 nom、prenom 和这些字段的设置位置。 =)

【讨论】:

  • 只是麻烦您再跟我核对一下,现在数据确实保存在数据库中,而不是在共享首选项中?有什么想法吗?
  • 嗯。你真的需要调用 getUserShrdPref();在 onClick() 中,因为用户实例应该已经有最新的数据了?这可能是 EKN 所说的,这是一个漫长的过程,并且 getUserShrdPref() 在 commit() 完成之前被调用。如果用户实例没有最新数据,您只需要调用 getUserShrdPref()。
  • 我已经考虑了您的评论,如果可以麻烦您,请再问一个问题,因为共享首选项数据正在活动中被修改,按下后退按钮时,用户将返回对于一个片段,我想知道片段生命周期中的哪个位置,正在调用什么方法?
  • 这取决于您的实现。调试和放置断点或调试日志语句应该会有所帮助。干杯。
  • 其实我会选择默认实现,没什么特别的,但是活动生命周期和片段生命周期之间的来来往往让我感到困惑,无论如何谢谢@kailoon,你一直很有帮助
【解决方案2】:

Json 到字符串的转换是一个耗时的过程。根据您的共享偏好的代码更新就在 json 转换代码的下方。在 json 转换之前有机会执行共享的 pref 更新。

因此,更好的解决方案是使用异步任务进行此转换并在 onPostExcecute() 中更新共享首选项。这可能会解决您的问题。请尝试。

参考链接:https://developer.android.com/reference/android/os/AsyncTask.html

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-03-29
    • 2013-10-18
    • 2013-09-20
    • 2018-02-06
    • 2013-07-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多