您的位置:首页 > Web前端

WeakReference--弱引用,即在引用对象的同时仍然允许通过垃圾回收来回收该对象。

2018-03-29 00:44 519 查看
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();
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android
相关文章推荐