这些天应用登录后一直打印
* 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();
}
这个问题应该大部分应用程序都有,好好检查你的登录界面有没有泄漏哦,亲!