|
|
51CTO旗下网站
|
|
移动端

Shared Preferences

《Learning Android(中文版)》第7章首选项、文件系统、选项菜单及Intent,本章我们讲解首选项功能的实现、文件系统的组织方式,以及如何通过intent与选项菜单在不同活动之间进行切换。本节为大家介绍Shared Preferences。

作者:李亚舟/任中龙/杜钢译来源:电子工业出版社|2012-07-27 11:10

Shared Preferences

已经有了选项界面,也有了存储用户名、密码、API 地址等选项数据的办法,剩下的就是把这些数据用起来了。要在程序中访问选项数据的内容,就使用由Android框架提供的SharedPreference类。

这个类允许我们在程序的任何部分(比如活动、服务、广播接收器和内容提供器)中访问选项数据,这也正是SharedPreference这个名字的由来。

在StatusActivity中新加入一个全局成员prefs:

  1. SharedPreferences prefs; 
然后在onCreate()中添加一段代码如下,以获取中preference对象的引用。
  1. @Override  
  2. public void onCreate(Bundle savedInstanceState) {  
  3. ...  
  4. // 设置首选项  
  5. prefs = PreferenceManager.getDefaultSharedPreferences(this); // .  
  6. prefs.registerOnSharedPreferenceChangeListener(this); // .  

每个程序都有自己唯一的共享首选项对象,可供当前上下文中所有的组件访问。我们可以通过把当前上下文作为this传给PreferenceManager.getDefaultSharedPrefere-nces()来获取SharedPreferences的实例。名字中的“共享(shared)”可能会让人疑惑,在此说明一下,它是指这个首选项对象所包含的数据,允许在当前程序的各部分之间共享,而不能与其他程序共享。

选项数据可能随时被用户修改,所以需要提供一个机制来通知活动某些选项数据被修改了,已经过期了。为此我们把this,也就是StatusActivity注册为首选项更改事件的侦听器。要这样做的话,需要添加...implementsOnSharedPreferenceChange-Listener接口,并添加实现该接口所必需的onSharedPreferenceChanged()方法。具体内容将在后面讨论。

现在用户名、密码与API 地址几项都已定义,接下来我们可以重构代码中的Twitter对象部分,消除原先的硬编码。我们可以为StatusActivity添加一个私有方法,用以返回可用的twitter对象。它将惰性地初始化twitter对象,也就是先判断twitter对象是否存在,若存在则将其返回;若不存在,则创建该对象。

  1. private Twitter getTwitter() {  
  2. if (twitter == null) { // 凕  
  3. String username, password, apiRoot;  
  4. username = prefs.getString("username", ""); //   
  5. password = prefs.getString("password", "");  
  6. apiRoot = prefs.getString("apiRoot", "http://yamba.marakana.com/api");  
  7. // .钡twitter.com  
  8. twitter = new Twitter(username, password); //   
  9. twitter.setAPIRootUrl(apiRoot); //   
  10. }  
  11. return twitter;  

仅在twitter为null(即未定义)时,创建该对象。

从共享首选项对象中获取用户名与密码。getString()的第1个参数是我们为选项条目指定的键名,比如username和password;第2个参数是条目不存在时备用的默认值。要注意,当用户第一次运行你的应用的时候,首选项文件还不存在,一定会返回默认值。因此,如果用户还没有在PrefsActivity里设置过个人选项,这里的代码将尝试使用空的用户名和密码登录,自然就会失败。不过用户只有在尝试发送消息时才会看到错误,这是因为jtwitter库就是这样设计的。

按照用户提供的用户名、密码登录。

记得要将API地址设置成真正的服务地址,才能将信息发上去。

现在,我们不再直接引用twitter对象,而是统一改为通过getTwitter()获取它的引用。修改后的onClick()方法如下。

  1. public void onClick(View v) {  
  2. // 修改twitter状态  
  3. try {  
  4. getTwitter().setStatus(editText.getText().toString());  
  5. } catch (TwitterException e) {  
  6. Log.d(TAG, "Twitter setStatus failed: " + e);  
  7. }  

注意,我们虽然初始化网络连接的代码,但它依然是阻塞的,可能会因为网络状况的不同产生一定的延迟。日后我们仍需对此做些考虑,利用AsyncTask来改进它。

前面在修改onCreate()为选项数据的更新注册侦听器之前曾提到,我们需要跟踪用户名与密码的变化。为此在当前的类中添加onSharedPreferenceChanged()方法,实现OnSharedPreferenceChangeListener,然后在onCreate()中通过pres.register-OnSharedPreferenceChangeListener(this)将它注册到prefs对象,这样就得到一个回调函数onSharedPreferenceChanged(),系统会在选项数据变化时触发。在这个方法中,我们只需简单地将twitter对象设为null使之失效,到下次试图获取它的引用时,getTwitter()会重新创建它的实例。

  1. public void onSharedPreferenceChanged(SharedPreferences prefs, String key) {  
  2. // invalidate twitter object  
  3. twitter = null;  
【责任编辑:book TEL:(010)68476606】

回书目   上一节   下一节
点赞 0
分享:
大家都在看
猜你喜欢

读 书 +更多

鸟哥的Linux私房菜 基础学习篇(第二版)

本书全面而详细地介绍了Linux操作系统。全书分为5个部分:第一部分着重说明Linux的起源及功能,如何规划和安装Linux主机;第二部分介绍Linu...

订阅51CTO邮刊

点击这里查看样刊

订阅51CTO邮刊