NullPointerException-那些牛逼的大厂有哪些傻貂的操作
Posted 太书红叶
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了NullPointerException-那些牛逼的大厂有哪些傻貂的操作相关的知识,希望对你有一定的参考价值。
网易(我母公司啊)即时通讯的沙雕操作
背景
很久以前的事了。造成了崩溃率上升。
APP发现有很多oom,于是做个优化吧,优化里有这么一个操作,低内存的时候清除一下内存中图片glide的缓存。
发生问题
于是在application里的onLowMemory方法里:
(我记得是这个方法,已经很久远了,可能记得不太清,总之是调的glide的方法)
Glide.get(instance).clearMemory();
可惜万万没想到,APP内集成了网易即时通讯的uikit这个demo,连改都没有改。
这个demo里也引用了Glide图片缓存库,有这么一个类:NIMGlideModule 这个类是Glide的配置类。
他做了这么个操作:
private static final String TAG = "NIMGlideModule";
private static final int M = 1024 * 1024;
private static final int MAX_DISK_CACHE_SIZE = 256 * M;
/**
* ************************ Memory Cache ************************
*/
static void clearMemoryCache(Context context)
Glide.get(context).clearMemory();
/**
* ************************ GlideModule override ************************
*/
@Override
public void applyOptions(Context context, GlideBuilder builder)
// sdcard/android/data/com.netease.nim.demo/glide
final String cachedDirName = "glide";
builder.setDiskCache(new ExternalCacheDiskCacheFactory(context, cachedDirName, MAX_DISK_CACHE_SIZE));
LogUtil.i(TAG, "NIMGlideModule apply options, disk cached path=" + context.getExternalCacheDir() + File.pathSeparator + cachedDirName);
@Override
public void registerComponents(Context context, Glide glide)
乍一看,没什么问题是吧。但是APP上线之后问题就出在这里了。
为什么呢,先记住这里的LogUtil,打印日志的tag是static的。可能说到这里,有些人就知道怎么回事了。我们看一下网易的LogUtil:
public static void d(String tag, String msg)
log.d(buildTag(tag), buildMessage(msg));
protected static String buildTag(String tag)
return TextUtils.isEmpty(process) ? tag : "[" + process + "]" + tag;
logutil后面还有很多内容就不需要看了,他从来没有对tag进行非空判断。
看吧,低内存的时候,Android系统会干什么?
没错,优先清除static变量,呵呵?。
于是低内存的时候,我在清理Glide中内存的缓存,而同时网易即时通讯的uikit,却在配置Glide的地方,打印了一个static修饰的tag的日志,并且低内存的时候这个tag被回收,变为null。
于是造成了空指针崩溃。
我尼玛骚操作。tag能用static的还不判空。
解决
崩溃率上升了,怎么办?发版本修复啊,没有热更新我能怎么办,我也很崩溃啊。
扯扯犊子
骚。真的骚。
以上是关于NullPointerException-那些牛逼的大厂有哪些傻貂的操作的主要内容,如果未能解决你的问题,请参考以下文章