android在悬浮窗循环显示时间,过一段时间后卡死?

开始的时候是正常的可以拖动,几分钟就出现卡死,不能拖动的现象?

以下是部分代码

  private FloatViewUtils(Context mContext) {
        this.mContext = mContext;
        manager = (WindowManager) mContext.getSystemService(Context.WINDOW_SERVICE);
        floatView = new FloatView(mContext);

    }

    public static FloatViewUtils getInstance(Context mContext) {
        if (null == instance) {
            synchronized (FloatViewUtils.class) {
                if (null == instance) {
                    instance = new FloatViewUtils(mContext);
                }
            }
        }
        return instance;
    }
    WindowManager.LayoutParams lp = new WindowManager.LayoutParams();
    public void addFloatView() {

        lp.width = floatView.WIDTH;
        lp.height = floatView.HEIGHT;

        lp.gravity = Gravity.LEFT | Gravity.CENTER;
//    lp.x = 0;
//    lp.y = 0;
        //设置悬浮窗口类型
        lp.type = WindowManager.LayoutParams.TYPE_PHONE;
        //设置悬浮窗口不接受焦点及触摸事件
        lp.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;
        //设置图片格式,效果为背景透明
        lp.format = PixelFormat.RGBA_8888;
        manager.addView(floatView, lp);

        new TimeThread().start();


        floatView.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {

                switch (event.getAction()) {
                    case MotionEvent.ACTION_DOWN:
                        mStartX = event.getRawX();
                        mStartY = event.getRawY();
                        break;

                    case MotionEvent.ACTION_MOVE:
                        lp.x += event.getRawX() - mStartX;
                        lp.y += event.getRawY() - mStartY;
                        manager.updateViewLayout(floatView, lp);
                        mStartX = event.getRawX();
                        mStartY = event.getRawY();
                        break;
                    case MotionEvent.ACTION_UP:
                        break;
                }

                // 消耗触摸事件
                return true;

            }

            private float mStartX, mStartY;
        });
    }
    public class TimeThread extends Thread {
        @Override
        public void run () {
            do {
                try {
                    Thread.sleep(1000);
                    Message msg = new Message();
                    msg.what = msgKey1;
                    mHandler.sendMessage(msg);
                }
                catch (InterruptedException e) {
                    e.printStackTrace();
                }

                floatView.postInvalidate();
            } while(true);
        }
    }

    private Handler mHandler = new Handler() {
        @Override
        public void handleMessage (Message msg) {
            super.handleMessage(msg);
            switch (msg.what) {
                case msgKey1:
                    long sysTime = System.currentTimeMillis();
                    CharSequence sysTimeStr = DateFormat.format("HH:mm:ss", sysTime);

                    strText = sysTimeStr.toString();
                    floatView.text = strText.toString();

                    break;

                default:
                    break;
            }
        }
    };

https://zhidao.baidu.com/question/2075051282684182668.html

这里没有贴出拖动的代码,把拖动的那部分贴出来看看

floatView.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {

            // 当前值以屏幕左上角为原点
            switch (event.getAction()) {
                case MotionEvent.ACTION_DOWN:
                    mStartX = event.getRawX();
                    mStartY = event.getRawY();
                    break;

                case MotionEvent.ACTION_MOVE:
                    lp.x += event.getRawX() - mStartX;
                    lp.y += event.getRawY() - mStartY;
                    manager.updateViewLayout(floatView, lp);
                    mStartX = event.getRawX();
                    mStartY = event.getRawY();
                    break;
                case MotionEvent.ACTION_UP:
                    break;
            }

            return true;

        }

        private float mStartX, mStartY,fuckx,fucky;
    });

            @li504799868 

//个人觉得你的子线程处理了handler,还加上睡眠,感觉操作不对、
//可以试下以下的
public class TimeThread extends Thread {
@Override
public void run () {
do {
try {
mHandler.sendEmptyMessageDelayed(msgKey1,1000); //其实setText()内部调用invalidate(); 不需要主动申请UI刷新。
}
catch (InterruptedException e) {
e.printStackTrace();
}

            floatView.postInvalidate();
        } while(true);
    }
}