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();
    }
}


相关文章
|
23天前
|
Java 数据库 Android开发
【专栏】Kotlin在Android开发中的多线程优化,包括线程池、协程的使用,任务分解、避免阻塞操作以及资源管理
【4月更文挑战第27天】本文探讨了Kotlin在Android开发中的多线程优化,包括线程池、协程的使用,任务分解、避免阻塞操作以及资源管理。通过案例分析展示了网络请求、图像处理和数据库操作的优化实践。同时,文章指出并发编程的挑战,如性能评估、调试及兼容性问题,并强调了多线程优化对提升应用性能的重要性。开发者应持续学习和探索新的优化策略,以适应移动应用市场的竞争需求。
|
23天前
|
Java Android开发
Android系统 获取用户最后操作时间回调实现和原理分析
Android系统 获取用户最后操作时间回调实现和原理分析
39 0
|
23天前
|
Android开发 Python
Python封装ADB获取Android设备wifi地址的方法
Python封装ADB获取Android设备wifi地址的方法
66 0
|
23天前
|
Linux Android开发
测试程序之提供ioctl函数应用操作GPIO适用于Linux/Android
测试程序之提供ioctl函数应用操作GPIO适用于Linux/Android
18 0
|
23天前
|
Android开发
Android 分享机顶盒项目的封装类《GridView》(二)(转)
Android 分享机顶盒项目的封装类《GridView》(二)(转)
20 2
|
23天前
|
存储 Java 开发工具
在Eclipse配置安装Android详细教程(新手)
在Eclipse配置安装Android详细教程(新手)
42 1
|
21天前
|
达摩院 安全 Java
80 PM撸代码之Android【武侠讲封装、继承、多态】
80 PM撸代码之Android【武侠讲封装、继承、多态】
24 0
|
23天前
|
XML Java Android开发
Android 分享机顶盒项目的封装类《GridView》(三)(转)
Android 分享机顶盒项目的封装类《GridView》(三)(转)
13 2
|
23天前
|
Oracle Java 关系型数据库
Android零基础入门(一)配置环境和安装Android Studio
Android零基础入门(一)配置环境和安装Android Studio
29 0
|
23天前
|
编解码 调度 Android开发
Android音频框架之一 详解audioPolicy流程及HAL驱动加载与配置
Android音频框架之一 详解audioPolicy流程及HAL驱动加载与配置
42 0