美文网首页
Handler使用一个坑

Handler使用一个坑

作者: 小鹿儿 | 来源:发表于2016-06-03 17:09 被阅读305次

这周在做公司的一个需求时,发现了Handler的一个坑,记录之。
需求是做一个活动,需要在首页添加悬浮球,下滑时悬浮球隐藏一半,上滑时,全部显示。如果来回上下滑动,则当滑动停止1s后,根据最后的滑动方向来判断悬浮球是否全部显示。
我的想法是使用Handler延时1s发送个Message,关键代码如下:

private void handleScroll(int newState) {
    if (newState == RecyclerView.SCROLL_STATE_IDLE) {
        mHandler.removeMessages(MSG_SCROLL_STATE_IDLE);
        mHandler.sendEmptyMessageDelayed(MSG_SCROLL_STATE_IDLE, 1000);
    } else if (newState == RecyclerView.SCROLL_STATE_DRAGGING) {
        mHandler.removeMessages(MSG_SCROLL_STATE_IDLE);
    }
}

private Handler mHandler = new Handler() {
    @Override
    public void handleMessage(Message msg) {
        super.handleMessage(msg);
        switch (msg.what) {
            case MSG_SCROLL_STATE_IDLE:
                switch (mScrollState) {
                    case DOWN:
                        showFullEntrance(true);
                        break;
                    case UP:
                        showFullEntrance(false);
                        break;
                }
                break;
        }
    }
};
private void showFullEntrance(boolean showFullEntrance) {
    if (mHomeData == null || mHomeData.floatView == null) {
        return;
    }
    float translationX;
    if (showFullEntrance) {
        translationX = DisplayUtil.dip2px(getContext(), 0);
    } else {
        translationX = DisplayUtil.dip2px(getContext(), 50);
    }
    this.mShowFullEntrance = showFullEntrance;
    ObjectAnimator translationXAnimator = ObjectAnimator.ofFloat(mEntranceIv, "translationX", translationX);
    translationXAnimator.setDuration(200);
    translationXAnimator.start();
}

大眼一看,好像也没什么问题。
但当我们快速滑动之后,然后立马切换到MainActivity的其他Fragment页面,那么首页对应的HomeFragment有可能被销毁,然后getContext()返回为null,再然后就崩溃了,,,
同理,当我们自己写了个线程,如果没有在合适的地方终止,而线程内部又有setText()getContext()等操作,则很容易造成空指针异常。
解决方案有二:

  • 对控件进行非空判断或者使用ApplicationContext替代getContext()
  • onDestroy()中终止:mHandler.removeCallbacksAndMessages(null);
    以上。

相关文章

网友评论

      本文标题:Handler使用一个坑

      本文链接:https://www.haomeiwen.com/subject/nnfldttx.html