如何在代码中使用“共享首选项”保存数据?

时间:2019-02-15 15:52:18

标签: java android sharedpreferences

我正在制作一个Android应用程序,在该应用程序中,我通过Facebook登录,访问Facebook后,我使用Facebook User Image Url和Facebook User Name设置我的导航抽屉。 当我第二次尝试打开我的应用程序时,导航抽屉上没有出现Facebook User Image Url和Facebook User Name。

我尝试使用“共享首选项”保存Facebook用户名和图像网址,但现在我需要帮助,因为我尝试了很好,但没有发生。

    Bundle bundle = getIntent().getExtras();
    String id = bundle.getString("id");
    String name = bundle.getString("name");
    String image_url = "https://graph.facebook.com/" + id + "/picture?type=normal";

    SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
    SharedPreferences.Editor editor = prefs.edit();
    editor.putString("name", name);
    editor.putString("url",image_url);
    editor.commit();

    final IProfile profile = new 
    ProfileDrawerItem().withName(prefs.getString("name",""))
            .withIcon(prefs.getString("url",""))
            .withIdentifier(100);

    AccountHeader headerResult = new AccountHeaderBuilder()
            .withActivity(this)
            .withTextColor(Color.BLACK)
            .withTranslucentStatusBar(true)
            .addProfiles(profile)
            .build();

2 个答案:

答案 0 :(得分:0)

首选项代码实际上看起来还不错。所以我怀疑问题实际上出在其他地方。

您实际上是否尝试过将prefs.getString("url", "")prefs.getString("name", "")的结果记录到控制台以检查是否可以检索到任何内容?

您的问题甚至可能来自代码中的“更高”……您是否确实验证了bundle.getString("id")bundle.getString("name")返回了您期望的数据?

话虽这么说,您可以采取几项措施来提高SharedPreferences代码的可读性和稳定性。

将首选项声明为类字段。

public class YourActivity extends Activity {       

    private SharedPreferences userPreferences;


    @Override
    public void onCreate (Bundle savedInstanceState) {
        userPreferences = getSharedPreferences("USER_DATA", Context.MODE_PRIVATE);

        // ...
    }

    // ...
}

您不需要保留SharedPreferences.Editor实例的引用,因为所有put操作都返回一个实例。这样您就可以链接通话:

userPreferences.edit()
        .putString("name", name)
        .putString("url", image_url)
        .commit();

如果无法使其正常工作,则可以检查上面链接的调用的返回布尔值。 SharedPreferences.Editor::commit实际上会返回一个布尔值,表示写入是成功(true)还是失败(false)。
不过总的来说,我建议使用apply()而不是commit(),因为它是非阻塞的。即更改将被写入内存,然后写入操作系统计划的磁盘。现在,提交将阻塞您的UI线程,这可能会导致性能问题。

答案 1 :(得分:0)

您必须像这样保存数据:

SharedPreferences prefs = getSharedPreferences("MyPrefs", MODE_PRIVATE)
SharedPreferences.Editor editor = prefs.edit();
editor.putString("name", name);
editor.putString("url",image_url);
editor.commit();

并获取您的数据:

SharedPreferences prefs = getSharedPreferences("MyPrefs", MODE_PRIVATE)
String name = perfs.getString("name","");
String url  = perfs.getString("url","");