让代码更简单

Android的SharedPreference配置文件操作类封装

重要:本文最后更新于2022-11-08 19:26:12,某些文章具有时效性,若有错误或已失效,请在下方留言或联系代码狗

在Android项目应用中,经常会用到读取和保存配置文件。Android提供了SharedPreference类方便的对配置文件进行操作。但是,项目中到处穿梭着类似这样的代码:

复制
public WidgetListFactory(Context context) {
this.context = context;
SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(context);
userId = sp.getInt(SettingsUtil.USERID, -1);
}

这样的代码,有没有让人觉得一段乱糟糟的,不但一处是,只要用到配置的地方,写法太任性,太随意了有木有?

反正只要能获取到全局的context,在需要参数读取和保存的地方,可以实现操作配置文件。

这种重复的,低效率的事,没给代码增加一点儿清晰度,还容易造成混乱。

且按照模块化的思想,应该尽可能的复用现有的成果。如果这么乱糟糟的使用起来不便还容易出错,更无法复用。

因此,有必要对配置文件的操作理一理,归归类,管理起来,方便复用,可做为一个模块来用。

在应用启动时,加载读取配置文件。在需要保存时,直接赋值并调用saveCfg()即可。

以下为按照这种思想写的一个系统配置类。

使用起来是不是很简单,很直观?

复制
package com.example.yang.testmvvm.config;

import android.content.Context;
import android.util.Log;

import java.util.ArrayList;
import java.util.List;

/**
* Created by yangyongzhen on 2018/08/04
* 配置文件的全局管理,摒弃SharedPreference漫天飞
* 系统配置SysCfg类
* 在应用启动时,先初始化调用 SysCfg sysCfg = SysCfg.getInstance(context);
* 接着sysCfg.readConfig();完成加载。
* 然后全局的配置就可以使用,如sysCfg.ip.value即为IP地址的配置。
* sysCfg.ver.value = "5678";
* sysCfg.saveConfig();
* 即完成了参数的保存。
* 相比工程代码中到处穿梭的
* SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(context);
* userId = sp.getInt(SettingsUtil.USERID, -1);
* 是不是更清晰?更简单?更直观?
*/
public final class SysCfg {
public static final String TAG = "SysCfg"; //做为配置文件的文件名

private static Context context;
private static SysCfg instance = null;
SharedPreferencesHelper helper;

public class Field{
public String key;
public String value;
public Field(){
key = "null";
value = "null";
}
}
List<Field> list;
//fields,步骤1,用到的配置
public Field ver = new Field(); //版本
public Field ip = new Field(); //IP地址
public Field port= new Field(); //端口
public Field username = new Field(); //用户名
public Field password = new Field(); //密码

/**
* 需要增加或删除的变量配置都在这里修改
* @param contx
*/
private SysCfg(Context contx) {
context = contx;
helper = new SharedPreferencesHelper(context,TAG);
list = new ArrayList<>();

//步骤2:配置key
ver.key = "ver";
ip.key = "ip";
port.key = "port";
username.key = "username";
password.key = "password";

//步骤3:添加到list
list.add(ver);
list.add(ip);
list.add(port);
list.add(username);
list.add(password);
}

/**
* 保存参数时只需赋值,然后调用saveConfig()即可。
* @return
*/
public int saveConfig(){
for(Field filed :list){
helper.put(filed.key,filed.value);
}
return 0;
}

/**
*仅在应用启动时加载一次,调用readConfig();
* @return
*/
public int readConfig(){
for(Field filed :list){
helper.get(filed.key,filed.value);
}
return 0;
}
public void printConfig(){
String str="";
for(Field filed :list){
str += String.format("key=%s,value= %s\n",filed.key,filed.value);
}
Log.d(TAG, str);
}

public static SysCfg getInstance(Context contx){
if(instance == null){
instance = new SysCfg(contx);
}
return instance;
}
}
复制
package com.example.yang.testmvvm.config;

import android.content.Context;
import android.content.SharedPreferences;
import java.util.Map;

/**
* 对SharedPreferences的操作管理类
*/
public class SharedPreferencesHelper {
private SharedPreferences sharedPreferences;
private SharedPreferences.Editor editor;

public SharedPreferencesHelper(Context context, String FILE_NAME) {
sharedPreferences = context.getSharedPreferences(FILE_NAME,
Context.MODE_PRIVATE);
editor = sharedPreferences.edit();
}

/**
* 存储
*/
public void put(String key, Object object) {
if (object instanceof String) {
editor.putString(key, (String) object);
} else if (object instanceof Integer) {
editor.putInt(key, (Integer) object);
} else if (object instanceof Boolean) {
editor.putBoolean(key, (Boolean) object);
} else if (object instanceof Float) {
editor.putFloat(key, (Float) object);
} else if (object instanceof Long) {
editor.putLong(key, (Long) object);
} else {
editor.putString(key, object.toString());
}
editor.commit();
}

/**
* 获取保存的数据
*/
public Object get(String key, Object defaultObject) {
if (defaultObject instanceof String) {
return sharedPreferences.getString(key, (String) defaultObject);
} else if (defaultObject instanceof Integer) {
return sharedPreferences.getInt(key, (Integer) defaultObject);
} else if (defaultObject instanceof Boolean) {
return sharedPreferences.getBoolean(key, (Boolean) defaultObject);
} else if (defaultObject instanceof Float) {
return sharedPreferences.getFloat(key, (Float) defaultObject);
} else if (defaultObject instanceof Long) {
return sharedPreferences.getLong(key, (Long) defaultObject);
} else {
return sharedPreferences.getString(key, null);
}
}

/**
* 移除某个key值已经对应的值
*/
public void remove(String key) {
editor.remove(key);
editor.commit();
}

/**
* 清除所有数据
*/
public void clear() {
editor.clear();
editor.commit();
}
/**
* 查询某个key是否存在
*/
public Boolean contain(String key) {
return sharedPreferences.contains(key);
}
/**
* 返回所有的键值对
*/
public Map<String, ?> getAll() {
return sharedPreferences.getAll();
}
}

感觉很棒!可以赞赏支持我哟~

2 打赏

评论 (1)

登录后评论
看起来非常厉害的样子,值得学习的地方很多啊,会继续关注博主的
QQ咨询 邮件咨询 狗哥推荐