Shared Preferences
《Learning Android(中文版)》第7章首选项、文件系统、选项菜单及Intent,本章我们讲解首选项功能的实现、文件系统的组织方式,以及如何通过intent与选项菜单在不同活动之间进行切换。本节为大家介绍Shared Preferences。
- 作者:李亚舟/任中龙/杜钢译来源:电子工业出版社|2012-07-27 11:10
有奖调研 | 1TB硬盘等你拿 AI+区块链的发展趋势及应用调研
Shared Preferences
已经有了选项界面,也有了存储用户名、密码、API 地址等选项数据的办法,剩下的就是把这些数据用起来了。要在程序中访问选项数据的内容,就使用由Android框架提供的SharedPreference类。
这个类允许我们在程序的任何部分(比如活动、服务、广播接收器和内容提供器)中访问选项数据,这也正是SharedPreference这个名字的由来。
在StatusActivity中新加入一个全局成员prefs:
然后在onCreate()中添加一段代码如下,以获取中preference对象的引用。
- SharedPreferences prefs;
- @Override
- public void onCreate(Bundle savedInstanceState) {
- ...
- // 设置首选项
- prefs = PreferenceManager.getDefaultSharedPreferences(this); // .
- prefs.registerOnSharedPreferenceChangeListener(this); // .
- }
每个程序都有自己唯一的共享首选项对象,可供当前上下文中所有的组件访问。我们可以通过把当前上下文作为this传给PreferenceManager.getDefaultSharedPrefere-nces()来获取SharedPreferences的实例。名字中的“共享(shared)”可能会让人疑惑,在此说明一下,它是指这个首选项对象所包含的数据,允许在当前程序的各部分之间共享,而不能与其他程序共享。
选项数据可能随时被用户修改,所以需要提供一个机制来通知活动某些选项数据被修改了,已经过期了。为此我们把this,也就是StatusActivity注册为首选项更改事件的侦听器。要这样做的话,需要添加...implementsOnSharedPreferenceChange-Listener接口,并添加实现该接口所必需的onSharedPreferenceChanged()方法。具体内容将在后面讨论。
现在用户名、密码与API 地址几项都已定义,接下来我们可以重构代码中的Twitter对象部分,消除原先的硬编码。我们可以为StatusActivity添加一个私有方法,用以返回可用的twitter对象。它将惰性地初始化twitter对象,也就是先判断twitter对象是否存在,若存在则将其返回;若不存在,则创建该对象。
- private Twitter getTwitter() {
- if (twitter == null) { // 凕
- String username, password, apiRoot;
- username = prefs.getString("username", ""); //
- password = prefs.getString("password", "");
- apiRoot = prefs.getString("apiRoot", "http://yamba.marakana.com/api");
- // .钡twitter.com
- twitter = new Twitter(username, password); //
- twitter.setAPIRootUrl(apiRoot); //
- }
- return twitter;
- }
仅在twitter为null(即未定义)时,创建该对象。
从共享首选项对象中获取用户名与密码。getString()的第1个参数是我们为选项条目指定的键名,比如username和password;第2个参数是条目不存在时备用的默认值。要注意,当用户第一次运行你的应用的时候,首选项文件还不存在,一定会返回默认值。因此,如果用户还没有在PrefsActivity里设置过个人选项,这里的代码将尝试使用空的用户名和密码登录,自然就会失败。不过用户只有在尝试发送消息时才会看到错误,这是因为jtwitter库就是这样设计的。
按照用户提供的用户名、密码登录。
记得要将API地址设置成真正的服务地址,才能将信息发上去。
现在,我们不再直接引用twitter对象,而是统一改为通过getTwitter()获取它的引用。修改后的onClick()方法如下。
- public void onClick(View v) {
- // 修改twitter状态
- try {
- getTwitter().setStatus(editText.getText().toString());
- } catch (TwitterException e) {
- Log.d(TAG, "Twitter setStatus failed: " + e);
- }
- }
注意,我们虽然初始化网络连接的代码,但它依然是阻塞的,可能会因为网络状况的不同产生一定的延迟。日后我们仍需对此做些考虑,利用AsyncTask来改进它。
前面在修改onCreate()为选项数据的更新注册侦听器之前曾提到,我们需要跟踪用户名与密码的变化。为此在当前的类中添加onSharedPreferenceChanged()方法,实现OnSharedPreferenceChangeListener,然后在onCreate()中通过pres.register-OnSharedPreferenceChangeListener(this)将它注册到prefs对象,这样就得到一个回调函数onSharedPreferenceChanged(),系统会在选项数据变化时触发。在这个方法中,我们只需简单地将twitter对象设为null使之失效,到下次试图获取它的引用时,getTwitter()会重新创建它的实例。
- public void onSharedPreferenceChanged(SharedPreferences prefs, String key) {
- // invalidate twitter object
- twitter = null;
- }
回书目 上一节 下一节 |
- 大家都在看
- 猜你喜欢
- 24H热文
- 一周话题
- 本月最赞
- 3.3.2 填空题(1)3.3.1.1 标准9针串口引脚定义R语言编程艺术2.6.1 @Produces注解2.1.1 添加或删除向量元素3.3.2 填空题(2)8.2.8 drawRoundRect方法:绘制圆角矩形12.2 使用DROP INDEX删除索引
- 3.3.1.1 标准9针串口引脚定义8.2.8 drawRoundRect方法:绘制圆角矩形一、中国制造2025主要内容2.6.1 @Produces注解深入理解Spring Cloud与微服务构建7.2.3 用ALTER TABLE语句来创建索引12.2 使用DROP INDEX删除索引2.1.1 添加或删除向量元素
- 3.3.1.1 标准9针串口引脚定义深入理解Spring Cloud与微服务构建8.2.8 drawRoundRect方法:绘制圆角矩形一、中国制造2025主要内容7.2.3 用ALTER TABLE语句来创建索引2.3 三角函数的图像2.6.1 @Produces注解12.2 使用DROP INDEX删除索引
视频课程+更多
-
全国计算机等级考试二级《MS Office高级应用
讲师:武永亮133560人学习过
-
企业级邮件服务器Exchange 2010视频课程
讲师:韩立刚83167人学习过
-
Linux集群全网服务器数据备份解决方案实战视
讲师:老男孩13011人学习过
最新专题+更多
- 精选博文
- 论坛热帖
- 下载排行
读 书 +更多
鸟哥的Linux私房菜 基础学习篇(第二版)
本书全面而详细地介绍了Linux操作系统。全书分为5个部分:第一部分着重说明Linux的起源及功能,如何规划和安装Linux主机;第二部分介绍Linu...
-
订阅51CTO邮刊
点击这里查看样刊