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();
}
}
虽然,知道这个名词但一直没有使用的场景,即使用如引用来减少内存泄漏的可能甚至避免内存泄漏。
项目中遇到这样一个需求,点击来切换正向和反向,长按通电,松开断电。
最后自定义按钮来解决这个问题。
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();
}
}
相关文章推荐
- 表示弱引用,即在引用对象的同时仍然允许垃圾回收来回收该对象。
- 面向对象_引用类型_内存分析_垃圾回收JAVA028-033
- 第8章 对象引用、可变性和垃圾回收
- 两个互相引用对象的垃圾回收
- 垃圾回收:没在GC Root链上的对象通过finalize()自我拯救的过程
- Java虚拟机垃圾回收(一) 基础:回收哪些内存/对象 引用计数算法 可达性分析算法 finalize()方法 HotSpot实现分析
- 流畅的python第八章对象引用,可变性和垃圾回收
- 两个互相引用对象的垃圾回收
- JVM内存回收区域+对象存活的判断+引用类型+垃圾回收线程
- 垃圾回收之判断对象否需要被回收(根搜索算法和引用搜索算法)
- 第三章 JVM内存回收区域+对象存活的判断+引用类型+垃圾回收线程
- javascript基础(对象,对象属性,属性基本和引用数据类型,字面量创建对象,垃圾回收,属性的枚举)(十三)
- Java虚拟机垃圾回收(一) 基础:回收哪些内存/对象 引用计数算法 可达性分析算法 finalize()方法 HotSpot实现分析
- jvm(三):对象引用与垃圾回收
- Java基础复习笔记 对象状态、引用种类、垃圾回收形式02
- 垃圾回收机制中,引入计数是如何实现的,内部原理是什么,怎么维持对象引用的
- jvm垃圾收集器回收什么样的对象以及各种引用
- Java对象的引用与垃圾回收
- 对象引用JAVA 各种reference和垃圾回收机制
- 对象的垃圾回收和四种引用