Samsung手机ClipboardUIManager引起的内存泄漏
这些天应用登录后一直打印
* Device: samsung samsung SM-G900F kltezh
* Android Version: 5.0 API: 21 LeakCanary: 1.3.1
* Durations: watch=7179ms, gc=142ms, heap dump=5176ms, analysis=61441ms
[ 29046:30530 D/LeakCanary ]
* Details:
* Class android.sec.clipboard.ClipboardUIManager
| static $staticOverhead = byte[] [id=0x71c176e1;length=32;size=48]
| static TAG = java.lang.String [id=0x70bcdae8]
| static mCBUIManager = null
| static sInstance = android.sec.clipboard.ClipboardUIManager [id=0x130cdbe0]
| static mClipboardMode = 0
* Instance of android.sec.clipboard.ClipboardUIManager
| static $staticOverhead = byte[] [id=0x71c176e1;length=32;size=48]
| static TAG = java.lang.String [id=0x70bcdae8]
| static mCBUIManager = null
| static sInstance = android.sec.clipboard.ClipboardUIManager [id=0x130cdbe0]
| static mClipboardMode = 0
| mAdapter = null
| mContext = com.aixuetang.channelsforteachers.activitys.LoginActivity [id=0x12f59300]
| mHandler = null
| mParentView = null
| mViewID = 0
* Instance of com.aixuetang.channelsforteachers.activitys.LoginActivity
貌似好像是内存泄露了,然后各种百度谷歌后发现这是三星系统的一个BUG,由于ClipboardUIManager是这样获取对象的
public static ClipboardUIManager getInstance(Context context) { if (sInstance == null) sInstance = new ClipboardUIManager(context); return sInstance; }在登录界面获取ClipboardUIManager对象传的Context实际上就是当前的Activity,这样LoginActivity就一直被引用没法释放了
解决办法在Application中先通过反射调用getInstance方法传入当前Application,具体代码如下
try { Class cls = Class.forName("android.sec.clipboard.ClipboardUIManager"); Method m = cls.getDeclaredMethod("getInstance", Context.class); m.setAccessible(true); m.invoke(null, this); } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (NoSuchMethodException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); }这个问题应该大部分应用程序都有,好好检查你的登录界面有没有泄漏哦,亲!
- 上一篇: 最近被内存泄漏和内存消耗过多弄惨了,发现了一篇好文章
- 下一篇: js中let和var定义变量的区别