首页 > 编程知识 正文

android contentprovider使用,android inflate详解

时间:2023-05-03 11:02:30 阅读:152777 作者:3166

SharedPreferences系列

《Android 之不要滥用 SharedPreferences》

《Android 之不要滥用 SharedPreferences(2)— 数据丢失》

基本信息SharedPreferences是安卓平台上的轻量级存储辅助类,用于存储APP应用程序的常规配置。 提供六种数据类型:字符串、集、整型、长整型、浮点型和布尔型。 最终的数据以xml格式保存。 在APP应用程序中,通常为简单数据创建永久缓存。

第一次创建存储机制SharedPreferences对象时,该文件的内容会根据文件名一次加载到mMap容器中。 每次在edit中都创建一个新的EditorImpl对象,在更改或添加数据时将数据添加到mModifiled容器中,然后在commit或apply操作中将map与mModifiled进行比较。get直接从map读取此时,如果保存较大的key或value,则在保存在内存中的状态下不会释放。

性能问题1,http://www.Sina.com /由于未使用交叉进程锁定,因此即使使用MODE_MULTI_PROCESS,如果SharedPreferences在交叉进程中频繁读写,也应该有数据据在线统计,SharedPreferences的损伤率约为万分之一。

2、http://www.Sina.com/shared preferences文件的加载使用异步线程。 此外,没有为加载线程设置优先级。 如果此时要读取数据,则必须等待文件加载线程的完成。 这将导致主线程等待低优先级线程锁的问题。 例如,读取100KB的SP文件需要大约50 ~ 100ms的时间。 建议您使用用于预加载开始过程的SP文件。

3、跨进程不安全commit ()、apply ) ),即使只更改其中一个条目,也会将整个内容写入文件。 此外,即使我们多次写入同一文件,SP也没有将多次修改合并为一次。 这也是绩效差的主要原因之一。

4、加载缓慢异步磁盘丢弃提供了apply机制,因此在崩溃或其他异常情况下可能会丢失数据。 因此,当APP应用程序接收系统广播或调用onPause时,系统会强制所有SharedPreferences对象中的数据到达磁盘。 如果落地没有完成,此时主线程将一直被阻止。 这非常容易导致纸箱,甚至ANR,从在线数据来看,SP纸箱的占有率通常超过5%。

系统提供的shared preferences APP场景用于存储非常简单、轻量级的数据。 请勿保存过于复杂的数据,如HTML、JSON等。 此外,SharedPreferences的文件存储性能取决于文件大小。 每个SP文件不能太大。 请勿将不相关的配置项目保存在同一文件中。 还应考虑单独分离经常更改的项目。

使用方法1、不要在SharedPreferences中添加大的key和值。 否则,不会一直保存在内存中释放。 如果内存使用过多,则会频繁发生GC,导致接口帧丢失或发生ANR。

2、无关的配置选项最好不要放在一起。 单个文件越大,读取速度越慢。

3、读取频率高的key和读取频率低的key尽量不要放在一起(文件整体小的情况下忽略)。 为了这种程度的性能而追加维护也没有损失)。

4、不要每次都编辑。 每次都要创建新的EditorImpl对象,因此最好在批量处理中批量提交。 否则,由于edit ().commit一次创建一个EditorImpl对象并执行I/o操作,因此会严重影响性能。

5、commit在UI线程中发生,apply在工作线程中发生,数据提交最好通过批量操作批量提交。 虽然APP发生在工作线程中,但I/o不会阻止UI线程。 但是,添加过多的任务还可能带来其他严重的后果(请参见实现ActivityThread源代码中的handleStopActivity方法)。

6、尽量不要保管json和html。 这样的文件可以直接缓存。

7、不要期望SharedPreferences能够进行进程间通信Context.PROCESS。

8、最好初始化SharedPreferences,避免在最初创建时读取文件的线程未完成而等待。

代码package * * * * import Android.content.context; import Android.content.shared preferences; import Java.lang.reflect.invocationtargetexception; import java.lang.reflect.Method; import java.util.Map; publicclasssputils { publicsputils (} {/* cannotbeinstantiated */thrownewunsupportedoperationexception (cannotbeinstion )

public static final String FILE_NAME = "share_data";/** * 保存数据的方法,我们需要拿到保存数据的具体类型,然后根据类型调用不同的保存方法 * * @param context * @param key * @param object */public static void put(Context context, String key, Object object){SharedPreferences sp = context.getSharedPreferences(FILE_NAME,Context.MODE_PRIVATE);SharedPreferences.Editor editor = sp.edit();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());}SharedPreferencesCompat.apply(editor);}/** * 得到保存数据的方法,我们根据默认值得到保存的数据的具体类型,然后调用相对于的方法获取值 * * @param context * @param key * @param defaultObject * @return */public static Object get(Context context, String key, Object defaultObject){SharedPreferences sp = context.getSharedPreferences(FILE_NAME,Context.MODE_PRIVATE);if (defaultObject instanceof String){return sp.getString(key, (String) defaultObject);} else if (defaultObject instanceof Integer){return sp.getInt(key, (Integer) defaultObject);} else if (defaultObject instanceof Boolean){return sp.getBoolean(key, (Boolean) defaultObject);} else if (defaultObject instanceof Float){return sp.getFloat(key, (Float) defaultObject);} else if (defaultObject instanceof Long){return sp.getLong(key, (Long) defaultObject);}return null;}/** * 移除某个key值已经对应的值 * * @param context * @param key */public static void remove(Context context, String key){SharedPreferences sp = context.getSharedPreferences(FILE_NAME,Context.MODE_PRIVATE);SharedPreferences.Editor editor = sp.edit();editor.remove(key);SharedPreferencesCompat.apply(editor);}/** * 清除所有数据 * * @param context */public static void clear(Context context){SharedPreferences sp = context.getSharedPreferences(FILE_NAME,Context.MODE_PRIVATE);SharedPreferences.Editor editor = sp.edit();editor.clear();SharedPreferencesCompat.apply(editor);}/** * 查询某个key是否已经存在 * * @param context * @param key * @return */public static boolean contains(Context context, String key){SharedPreferences sp = context.getSharedPreferences(FILE_NAME,Context.MODE_PRIVATE);return sp.contains(key);}/** * 返回所有的键值对 * * @param context * @return */public static Map<String, ?> getAll(Context context){SharedPreferences sp = context.getSharedPreferences(FILE_NAME,Context.MODE_PRIVATE);return sp.getAll();}/** * 创建一个解决SharedPreferencesCompat.apply方法的一个兼容类 * * @author zhy * */private static class SharedPreferencesCompat{private static final Method sApplyMethod = findApplyMethod();/** * 反射查找apply的方法 * * @return */@SuppressWarnings({ "unchecked", "rawtypes" })private static Method findApplyMethod(){try{Class clz = SharedPreferences.Editor.class;return clz.getMethod("apply");} catch (NoSuchMethodException e){}return null;}/** * 如果找到则使用apply执行,否则使用commit * * @param editor */public static void apply(SharedPreferences.Editor editor){try{if (sApplyMethod != null){sApplyMethod.invoke(editor);return;}} catch (IllegalArgumentException e){} catch (IllegalAccessException e){} catch (InvocationTargetException e){}editor.commit();}}}

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。