1:红包功能完成

This commit is contained in:
2025-10-15 18:57:40 +08:00
parent fd74ac51f4
commit 518b9afd32
37 changed files with 986 additions and 194 deletions

View File

@@ -2,12 +2,16 @@ package com.xscm.moduleutil.utils;
import android.os.Handler;
import android.os.Looper;
import com.blankj.utilcode.util.LogUtils;
import com.xscm.moduleutil.bean.RedPacketInfo;
import lombok.Getter;
import lombok.Setter;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
/**
* 红包管理器单例类
@@ -20,7 +24,7 @@ public class QXRedPacketManager {
// 私有构造函数,防止外部实例化
private QXRedPacketManager() {
this.redPackets = new HashMap<>();
this.redPackets = new ConcurrentHashMap<>();
}
/**
@@ -53,6 +57,8 @@ public class QXRedPacketManager {
this.redPackets.put(model.getRedpacket_id(), model);
}
// 在添加数据后启动定时器(如果尚未启动)
startCheckTimer();
if (this.delegate != null && this.delegate instanceof QXRedPacketManagerDelegate) {
((QXRedPacketManagerDelegate) this.delegate).onRedPacketsAdded(redPackets, this.redPackets.size());
}
@@ -70,6 +76,8 @@ public class QXRedPacketManager {
this.redPackets.put(redPacket.getRedpacket_id(), redPacket);
// 在添加数据后启动定时器(如果尚未启动)
startCheckTimer();
if (this.delegate != null && this.delegate instanceof QXRedPacketManagerDelegate) {
((QXRedPacketManagerDelegate) this.delegate).onRedPacketAdded(redPacket, this.redPackets.size());
}
@@ -111,6 +119,10 @@ public class QXRedPacketManager {
* 开始检查定时器
*/
public void startCheckTimer() {
// 如果定时器已经在运行,直接返回
if (checkTimerRunnable != null && checkTimerHandler != null) {
return;
}
if (checkTimerRunnable == null) {
checkTimerRunnable = new Runnable() {
@Override
@@ -128,9 +140,35 @@ public class QXRedPacketManager {
* 检查并更新红包状态
*/
private void checkAndUpdateRedPackets() {
// 添加空值检查
if (this.redPackets == null || this.redPackets.isEmpty()) {
return;
}
List<RedPacketInfo> packets = new ArrayList<>(this.redPackets.values());
for (RedPacketInfo packet : packets) {
long packetTime = packet.remainingTime();
LogUtils.e("红包剩余时间:" + packet.getRedpacket_time());
long redpacketTime = 0;
try {
if (packet.getRedpacket_time() != null) {
redpacketTime = Long.parseLong(packet.getRedpacket_time());
}
} catch (NumberFormatException e) {
LogUtils.e("红包时间格式错误: " + packet.getRedpacket_time());
}
if (packetTime <= -redpacketTime) {
removeRedPacket(packet.getRedpacket_id());
}
if (packet.getCountdown()==0){
continue;
}
if (this.delegate != null && this.delegate instanceof QXRedPacketManagerDelegate) {
((QXRedPacketManagerDelegate) this.delegate).didUpdateRedPacketTime(packet, packetTime);
}
boolean wasAvailable = packet.isAvailable();
packet.setAvailable(packet.canOpenNow());
@@ -140,12 +178,6 @@ public class QXRedPacketManager {
((QXRedPacketManagerDelegate) this.delegate).onRedPacketUpdated(packet, this.redPackets.size());
}
}
// 倒计时结束的红包可以设置自动移除
if (packet.getCountdown() > 0 && packet.remainingTime() <= -(Long.getLong(packet.getRedpacket_time()))) {
// 倒计时结束10秒后自动移除
removeRedPacket(packet.getRedpacket_id());
}
}
// 继续执行定时任务
@@ -157,6 +189,7 @@ public class QXRedPacketManager {
*/
public void removeAllRedPackets() {
this.redPackets.clear();
endCheckTimer();
}
/**
@@ -179,24 +212,6 @@ public class QXRedPacketManager {
this.delegate = null;
}
/**
* 设置委托对象
*
* @param delegate 委托对象
*/
public void setDelegate(QXRedPacketManagerDelegate delegate) {
this.delegate = delegate;
}
/**
* 获取委托对象
*
* @return 委托对象
*/
public QXRedPacketManagerDelegate getDelegate() {
return this.delegate;
}
/**
* 委托接口
*/
@@ -232,8 +247,29 @@ public class QXRedPacketManager {
* @param remainingCount 剩余数量
*/
void onRedPacketUpdated(RedPacketInfo packet, int remainingCount);
/**
* 更新红包时间回调
*
* @param packet 红包模型
* @param packetTime 红包剩余时间
*/
void didUpdateRedPacketTime(RedPacketInfo packet, long packetTime);
}
/**
* -- SETTER --
* 设置委托对象
*
*
* -- GETTER --
* 获取委托对象
*
@param delegate 委托对象
* @return 委托对象
*/
@Getter
@Setter
private QXRedPacketManagerDelegate delegate;
}