在写自定义控件时,IDE提示这样子写可能会发生泄漏
提示可能发生泄漏的代码
private class CustomHandler extends Handler {
@Override
public void handleMessage(@NonNull Message msg) {
super.handleMessage(msg);
if (animCurrentPage < animMaxPage && animCurrentPage >= 0) {
invalidate();
if (animState == ANIM_NULL) {
return;
}
if (animState == ANIM_CHECK) {
animCurrentPage++;
} else if (animState == ANIM_UNCHECK) {
animCurrentPage--;
}
this.sendEmptyMessageDelayed(0, animDuration / animMaxPage);
Log.e("CustomHandler", "animCurrentPage:" + animCurrentPage);
} else {
if (isCheck) {
animCurrentPage = animMaxPage - 1;
} else {
animCurrentPage = -1;
}
invalidate();
animState = ANIM_NULL;
}
}
}
通过搜索引擎搜索到结果后,修改后的代码
private static class CustomHandler extends Handler {
private final WeakReference mCheckView;
CustomHandler(CheckView checkView) {
mCheckView = new WeakReference<>(checkView);
}
@Override
public void handleMessage(@NonNull Message msg) {
super.handleMessage(msg);
CheckView checkView = mCheckView.get();
if (checkView != null) {
int animCurrentPage = checkView.animCurrentPage;
int animMaxPage = checkView.animMaxPage;
int animState = checkView.animState;
if (animCurrentPage < animMaxPage && animCurrentPage >= 0) {
checkView.invalidate();
if (animState == ANIM_NULL) {
return;
}
if (animState == ANIM_CHECK) {
checkView.animCurrentPage++;
} else if (animState == ANIM_UNCHECK) {
checkView.animCurrentPage--;
}
this.sendEmptyMessageDelayed(0, checkView.animDuration / animMaxPage);
Log.e("CustomHandler", "animCurrentPage:" + animCurrentPage);
} else {
if (checkView.isCheck) {
checkView.animCurrentPage = animMaxPage - 1;
} else {
checkView.animCurrentPage = -1;
}
checkView.invalidate();
checkView.animState = ANIM_NULL;
}
}
}
}
请问一下,这样子修改后,是否就可以解决泄漏的问题呢?我通过LeakCanary检测后并没有发现什么,但是我不知道这样子写是否规范?