/**
- 删除 & 查询
*/
private void initContainRemove() {
mStr.append(“\n删除 & 查询\n”);
mStr.append(“删除单个指定key \n”);
mKv.removeValueForKey(“bool”);
mStr.append(“key=>bool,value=>” + mKv.decodeBool(“bool”) + " \n\n");
mStr.append(“删除多个指定key \n”);
mKv.removeValuesForKeys(new String[]{“int”, “long”});
mStr.append(“key=>int,long,value=>” + mKv.decodeBool(“int”) + “-----” + mKv.decodeBool(“long”) + " \n\n");
mStr.append(“查询所有数据 \n”);
mStr.append(“所有数据:” + Arrays.toString(mKv.allKeys()) + " \n\n");
mStr.append(“查询是否存在某个数据 \n”);
boolean hasStringKey = mKv.containsKey(“string”);
boolean hasString = mKv.contains(“string”);
mStr.append(“是否存在string====>hasStringKey:” + hasStringKey + “; hasString:” + hasString + " \n\n");
mStr.append(“清楚数据 \n”);
mKv.clearAll();
boolean string = mKv.containsKey(“string”);
mStr.append(“清除后是否有数据:” + string + " \n\n");
mTextView.setText(mStr.toString());
}
- SharedPreferences 迁移
//SharedPreferences preferences = getSharedPreferences(“myData”, MODE_PRIVATE);
MMKV preferences = MMKV.mmkvWithID(“MyID”);
// 迁移旧数据
{
SharedPreferences old_SP = getSharedPreferences(“MyID”, MODE_PRIVATE);
preferences.importFromSharedPreferences(old_SP);
old_SP.edit().clear().commit();
}
// 跟以前用法一样
SharedPreferences.Editor editor = preferences.edit();
editor.putBoolean(“bool”, true);
editor.putInt(“int”, Integer.MIN_VALUE);
editor.putLong(“long”, Long.MAX_VALUE);
editor.putFloat(“float”, -3.14f);
editor.putString(“string”, “HUANG”);
HashSet set = new HashSet();
set.add(“H”);
set.add(“U”);
set.add(“A”);
set.add(“N”);
set.add(“G”);
editor.putStringSet(“set”, set);
// 无需调用 commit()
//editor.commit();
- 工具类封装
package aa.datastore.mmkv.utils;
import android.os.Parcelable;
import com.tencent.mmkv.MMKV;
import java.util.Collections;
import java.util.Set;
public class SpUtils {
private static MMKV mkv;
private SpUtils() {
mkv = MMKV.defaultMMKV();
}
public static SpUtils getInstance() {
return SingletonHolder.sInstance;
}
//静态内部类
private static class SingletonHolder {
private static final SpUtils sInstance = new SpUtils();
}
/**
-
保存数据的方法,我们需要拿到保存数据的具体类型,然后根据类型调用不同的保存方法
-
@param key
-
@param object
*/
public static void encode(String key, Object object) {
if (object instanceof String) {
mkv.encode(key, (String) object);
} else if (object instanceof Integer) {
mkv.encode(key, (Integer) object);
} else if (object instanceof Boolean) {
mkv.encode(key, (Boolean) object);
} else if (object instanceof Float) {
mkv.encode(key, (Float) object);
} else if (object instanceof Long) {
mkv.encode(key, (Long) object);
} else if (object instanceof Double) {
mkv.encode(key, (Double) object);
} else if (object instanceof byte[]) {
mkv.encode(key, (byte[]) object);
} else {
mkv.encode(key, object.toString());
}
}
public static void encodeSet(String key, Set sets) {
mkv.encode(key, sets);
}
public static void encodeParcelable(String key, Parcelable obj) {
mkv.encode(key, obj);
}
/**
-
得到保存数据的方法,我们根据默认值得到保存的数据的具体类型,然后调用相对于的方法获取值
-
@param key
-
@param defaultObject
-
@return
*/
public static Object decode(String key, Object defaultObject) {
if (defaultObject instanceof String) {
return mkv.decodeString(key, (String) defaultObject);
} else if (defaultObject instanceof Integer) {
return mkv.decodeInt(key, (Integer) defaultObject);
} else if (defaultObject instanceof Boolean) {
return mkv.decodeBool(key, (Boolean) defaultObject);
} else if (defaultObject instanceof Float) {
return mkv.decodeFloat(key, (Float) defaultObject);
} else if (defaultObject instanceof Long) {
return mkv.decodeLong(key, (Long) defaultObject);
} else if (defaultObject instanceof Double) {
return mkv.decodeDouble(key, (Double) defaultObject);
} else if (defaultObject instanceof byte[]) {
return mkv.decodeBytes(key, (byte[]) defaultObject);
}
return defaultObject;
}
/**
- 得到保存数据的方法,我们根据默认值得到保存的数据的具体类型,然后调用相对于的方法获取值
*/
public static Integer decodeInt(String key) {
return mkv.decodeInt(key, 0);
}
public static Double decodeDouble(String key) {
return mkv.decodeDouble(key, 0.00);
}
public static Long decodeLong(String key) {
return mkv.decodeLong(key, 0L);
}
public static Boolean decodeBoolean(String key) {
return mkv.decodeBool(key, false);
}
public static Float decodeFloat(String key) {
return mkv.decodeFloat(key, 0F);
}
public static byte[] decodeBytes(String key) {
return mkv.decodeBytes(key);
}
public static String decodeString(String key) {
return mkv.decodeString(key, “”);
}
public static Set decodeStringSet(String key) {
return mkv.decodeStringSet(key, Collections.emptySet());
}
public static Parcelable decodeParcelable(String key, Class clz) {
return mkv.decodeParcelable(key, clz);
}
/**
-
移除某个key对
-
@param key
*/
public static void removeKey(String key) {
mkv.removeValueForKey(key);
}
/**
-
移除多个key对
-
@param key
*/
public static void removeKeys(String[] key) {
mkv.removeValuesForKeys(key);
}
/**
- 获取全部key对
*/
public static String[] getAllKeys() {
return mkv.allKeys();
}
/**
-
含有某个key
-
@param key
-
@return
*/
public static boolean hasKey(String key) {
return mkv.containsKey(key);
}
/**
-
含有某个key
-
@param key
-
@return
*/
public static boolean have(String key) {
return mkv.contains(key);
}
/**
- 清除所有key
*/
public static void clearAll() {
mkv.clearAll();
}
/**
-
获取操作对象
-
@return
*/
public static MMKV getMkv() {
return mkv;
}
}
- 工具类使用
/**
- 工具类使用
*/
private void iniSpUtils() {
mStr.append(“工具类使用\n”);
mStr.append(“boolean数据类型 \n”);
SpUtils.getInstance().encode(“bool”, true);
mStr.append(“key=>bool,value=>” + SpUtils.getInstance().decode(“bool”, false) + " \n\n");
mStr.append(“int数据类型 \n”);
SpUtils.getInstance().encode(“int”, 2020);
mStr.append(“key=>int,value=>” + SpUtils.getInstance().decode(“int”, 0) + " \n\n");
mStr.append(“long数据类型 \n”);
SpUtils.getInstance().encode(“long”, Long.MAX_VALUE);
mStr.append(“key=>long,value=>” + SpUtils.getInstance().decode(“long”, 0L) + " \n\n");
mStr.append(“float数据类型 \n”);
SpUtils.getInstance().encode(“float”, 3.14f);
mStr.append(“key=>float,value=>” + SpUtils.getInstance().decode(“float”, 0f) + " \n\n");
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:Android)
最后
今天关于面试的分享就到这里,还是那句话,有些东西你不仅要懂,而且要能够很好地表达出来,能够让面试官认可你的理解,例如Handler机制,这个是面试必问之题。有些晦涩的点,或许它只活在面试当中,实际工作当中你压根不会用到它,但是你要知道它是什么东西。
最后在这里小编分享一份自己收录整理上述技术体系图相关的几十套腾讯、头条、阿里、美团等公司19年的面试题,把技术点整理成了视频和PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节,由于篇幅有限,这里以图片的形式给大家展示一部分。
还有 高级架构技术进阶脑图、Android开发面试专题资料,高级进阶架构资料 帮助大家学习提升进阶,也节省大家在网上搜索资料的时间来学习,也可以分享给身边好友一起学习。
【Android核心高级技术PDF文档,BAT大厂面试真题解析】
【算法合集】
【延伸Android必备知识点】
【Android部分高级架构视频学习资源】
**Android精讲视频领取学习后更加是如虎添翼!**进军BATJ大厂等(备战)!现在都说互联网寒冬,其实无非就是你上错了车,且穿的少(技能),要是你上对车,自身技术能力够强,公司换掉的代价大,怎么可能会被裁掉,都是淘汰末端的业务Curd而已!现如今市场上初级程序员泛滥,这套教程针对Android开发工程师1-6年的人员、正处于瓶颈期,想要年后突破自己涨薪的,进阶Android中高级、架构师对你更是如鱼得水,赶快领取吧!
《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》,点击传送门即可获取!
高级进阶架构资料 帮助大家学习提升进阶,也节省大家在网上搜索资料的时间来学习,也可以分享给身边好友一起学习。
【Android核心高级技术PDF文档,BAT大厂面试真题解析】
[外链图片转存中…(img-uatezYoS-1711766293569)]
【算法合集】
[外链图片转存中…(img-7VaawNCe-1711766293569)]
【延伸Android必备知识点】
[外链图片转存中…(img-RDEKHtlq-1711766293569)]
【Android部分高级架构视频学习资源】
**Android精讲视频领取学习后更加是如虎添翼!**进军BATJ大厂等(备战)!现在都说互联网寒冬,其实无非就是你上错了车,且穿的少(技能),要是你上对车,自身技术能力够强,公司换掉的代价大,怎么可能会被裁掉,都是淘汰末端的业务Curd而已!现如今市场上初级程序员泛滥,这套教程针对Android开发工程师1-6年的人员、正处于瓶颈期,想要年后突破自己涨薪的,进阶Android中高级、架构师对你更是如鱼得水,赶快领取吧!