WeakReference--弱引用,即在引用对象的同时仍然允许通过垃圾回收来回收该对象。
虽然,知道这个名词但一直没有使用的场景,即使用如引用来减少内存泄漏的可能甚至避免内存泄漏。
项目中遇到这样一个需求,点击来切换正向和反向,长按通电,松开断电。
最后自定义按钮来解决这个问题。
package com.clj.blesample.widget; import android.content.Context; import android.os.Handler; import android.os.Message; import android.os.SystemClock; import android.util.AttributeSet; import android.view.View; import java.lang.ref.WeakReference; public class LongClickButton extends android.support.v7.widget.AppCompatButton { private LongClickUpListener longClickListener; private long intervalTime; private MyHandler handler; public LongClickButton(Context context) { super(context); init(); } public LongClickButton(Context context, AttributeSet attrs) { super(context, attrs); init(); } public LongClickButton(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); init(); } /** * 初始化监听 */ private void init() { handler = new MyHandler(this); setOnLongClickListener(new OnLongClickListener() { @Override public boolean onLongClick(View v) { longClickListener.downAction(); new Thread(new LongClickThread()).start(); return true; } }); } /** * 长按时,该线程将会启动 */ private class LongClickThread implements Runnable { @Override public void run() { while (LongClickButton.this.isPressed()) { SystemClock.sleep(intervalTime); } handler.sendEmptyMessage(1); } } /** * 通过handler,使监听的事件响应在主线程中进行 */ private static class MyHandler extends Handler { private WeakReference<LongClickButton> ref; MyHandler(LongClickButton button) { ref = new WeakReference<>(button); } @Override public void handleMessage(Message msg) { super.handleMessage(msg); LongClickButton button = ref.get(); if (button != null && button.longClickListener != null) { button.longClickListener.upAction(); } } } public void setLongClickUpListener(LongClickUpListener listener, long intervalTime) { this.longClickListener = listener; this.intervalTime = intervalTime; } public void setLongClickUpListener(LongClickUpListener listener) { setLongClickUpListener(listener, 20); } public interface LongClickUpListener { void upAction(); void downAction(); } }