前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Android的配置文件操作封装,摒弃SharedPreference操作配置漫天乱飞

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

作者头像
杨永贞
发布2020-08-04 23:41:05
6470
发布2020-08-04 23:41:05
举报

在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();
    }
}
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018-08-04 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档