问题:APP突然所有使用butterknife的@onClick方式实现的按钮点击事件均失效
解决:查看butterknife源代码的DebouncingOnClickListener类
public abstract class DebouncingOnClickListener implements View.OnClickListener {
static boolean enabled = true;
private static final Runnable ENABLE_AGAIN = new Runnable() {
@Override public void run() {
enabled = true;
}
};
@Override public final void onClick(View v) {
if (enabled) {
enabled = false;
v.post(ENABLE_AGAIN);
doClick(v);
}
}
public abstract void doClick(View v);
}
我们注意到v.post(ENABLE_AGAIN),view.post方法在7.0后做了修改,系统不能保证post的内容一定会被执行,详情可参考https://blog.csdn.net/xavier__s/article/details/50260981,这就导致了enabled永远不会被置为true了,从而所以使用这种方式响应的点击事件都无法执行。具体到自己项目中的情况是在Activity启动后handler.post了一个runnable,里面调用了一个view的performClick,而在Activity被销毁时没有remove这个runnable,导致view已经detach了,进而view.post无法被执行。
所以建议以后的点击事件不要使用@OnClick的方式来做了。