专栏首页独行猫a的沉淀积累总结Android的配置文件操作封装,摒弃SharedPreference操作配置漫天乱飞

Android的配置文件操作封装,摒弃SharedPreference操作配置漫天乱飞

在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 com.example.yang.testmvvm.utils.LogUtil;

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

public class OthCfg {

    public static final String TAG = "OthCfg"; //做为配置文件的文件名

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

    public class STRING{
        private String key;
        public  String value;

        public STRING(String skey,String svalue){
            key   = skey;
            value = svalue;
        }
    }

    public class LONG{
        private String key;
        public  long value;
        public LONG(String skey,long lvalue){
            key   = skey;
            value = lvalue;
        }
    }
    List<Object> list;

    //fields,步骤1,用到的配置
    public  LONG cardRecCout =  new LONG("cardRecCout",0); //记录数量统计
    public  LONG cardRecMone =  new LONG("cardRecMone",0); //记录金额统计 汇总
    public  LONG sendRecNum  =  new LONG("sendRecNum",0); //已上传的记录数目 汇总
    /**
     * 需要增加或删除的变量配置都在这里修改
     * @param contx
     */
    private OthCfg(Context contx) {
        context = contx;
        helper = new SharedPreferencesHelper(context,TAG);
        list = new ArrayList<>();
        //步骤2:添加到list
        list.add(cardRecCout);
        list.add(cardRecMone);
        list.add(sendRecNum);

    }

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

    /**
     *仅在应用启动时加载一次,调用readConfig();
     * @return
     */
    public int readConfig(){
        for(Object obj : list){
            if(obj instanceof STRING){
                helper.get(((STRING)obj).key, ((STRING)obj).value);
            }else if(obj instanceof LONG) {
                helper.get(((LONG)obj).key, ((LONG)obj).value);
            }
        }
        return 0;
    }
    public void printConfig(){
        String str="";
        for(Object obj : list){
            if(obj instanceof STRING){
                str += String.format("key=%s,value= %s\n",((STRING)obj).key,((STRING)obj).value);
            }else if(obj instanceof LONG) {
                str += String.format("key=%s,value= %d\n",((LONG)obj).key,((LONG)obj).value);
            }
        }
        LogUtil.d(str);
    }

    public static OthCfg getInstance(Context contx){
        if(instance == null){
            instance = new OthCfg(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();
    }
}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Java串口读卡器工具通信之RXTX

    这里我使用一个自己制作的工具来完整卡片的读写和消费验证。这个工具使用了java的串口通信。

    特立独行的猫a
  • 动手写物联网平台(二、物联网和MQTT协议简介)

    物联网(Internet of Things,IoT)最近曝光率越来越高。虽然HTTP是网页的事实标准,不过机器之间(Machine-to-Machine,M2...

    特立独行的猫a
  • Mosquitto源码分析及用go语言的重新实现(一、开篇)

    Mosquitto是用C语言实现的MQTT物联网协议v3.1 的消息代理服务器。提供轻量级的,支持可发布/可订阅的的消息推送模式,使设备对设备之间的短消息通信变...

    特立独行的猫a
  • Java-表格数据的存储

    版权声明: ...

    Fisherman渔夫
  • 第31节:Java基础-类与对象

    Java基础-类与对象,方法的重载,构造方法的重载,static关键字,main()方法,this关键字,包,访问权限,类的继承,继承性,方法的重写,super...

    达达前端
  • php学习之类与对象的类的静态属性

    静态变量是当前类的所有对象共享的变量,任何一个该类的对象去访问它时,取得的都是相同的值,同样任何一个该类的对象去修改它时,也时同样被修改

    吾爱乐享
  • 【我们一起写框架】C#的AOP框架

    因为,AOP单独设计的框架几乎是无法使用的。普遍的情况是,AOP要是和其他设计模式结合在一起使用。

    Kiba518
  • BeanCopier使用说明

    ydymz
  • 别再重复造轮子了,几个值得应用到项目中的 Java 开源库送给你

    比如我们在拿到一个 List 集合之后,要对这个集合进行判空操作,以前我一直是这样写的:

    古时的风筝
  • 简单聊聊契约式设计(上)

    我在阅读Bob大叔的《敏捷软件开发:原则、模式与实践》第十章的时候第一次接触Design by Contract这个概念。Bob大叔在讲述面向对象设计SOLID...

    袁慎建@ThoughtWorks

扫码关注云+社区

领取腾讯云代金券