This commit is contained in:
2025-12-11 21:05:04 +08:00
parent ed0eccd0ee
commit d470b2fdb1
22 changed files with 537 additions and 151 deletions

View File

@@ -2,6 +2,8 @@ package com.xscm.modulemain
import android.app.Activity
import android.content.Context
import android.view.View
import com.blankj.utilcode.util.ActivityUtils
import com.blankj.utilcode.util.AppUtils
import com.blankj.utilcode.util.CrashUtils
import com.blankj.utilcode.util.LogUtils
@@ -12,12 +14,20 @@ import com.scwang.smartrefresh.layout.footer.ClassicsFooter
import com.scwang.smartrefresh.layout.header.ClassicsHeader
import com.xscm.modulemain.activity.main.activity.MainActivity
import com.xscm.modulemain.dialog.InviteDialog
import com.xscm.modulemain.manager.RoomManager
import com.xscm.modulemain.utils.TimerManager
import com.xscm.modulemain.widget.WheatLayoutSingManager
import com.xscm.moduleutil.base.CommonAppContext
import com.xscm.moduleutil.bean.IndexRecommendRoom
import com.xscm.moduleutil.bean.RoomMessageEvent
import com.xscm.moduleutil.dialog.ConfirmDialog
import com.xscm.moduleutil.http.BaseObserver
import com.xscm.moduleutil.http.RetrofitClient
import com.xscm.moduleutil.listener.MessageListenerSingleton
import com.xscm.moduleutil.utils.CustomMsgCode
import io.reactivex.disposables.Disposable
import org.json.JSONObject
import java.util.concurrent.TimeUnit
open class Application : CommonAppContext() {
@@ -66,7 +76,105 @@ open class Application : CommonAppContext() {
initCrashUtils()
initSmartRefreshLayout()
initImMsg()
}
private fun initImMsg() {
MessageListenerSingleton.getInstance().setOnMsgTaskListener { event ->
when (event.msgType) {
CustomMsgCode.CODE_TASK_APPRENTICE_JOIN_ROOM -> {
TimerManager.cancelTimer(CustomMsgCode.CODE_TASK_APPRENTICE_JOIN_ROOM_TIMER_ID)
val json = JSONObject(event.text.text)
event.text.status = json.getString("status")
event.text.room_id = json.getString("room_id")
when (event.text.status) {
"1" -> {//1:邀请
customDialog(
event.text.room_id,
CustomMsgCode.CODE_TASK_APPRENTICE_JOIN_ROOM_MSG,
5,
1,
event.text
)
}
"2" -> {//2:拒绝
customDialog(
"",
CustomMsgCode.CODE_TASK_APPRENTICE_JOIN_ROOM_MSG_REFUSE,
5,
3,
null,
"知道了",
""
)
}
}
}
}
}
}
private fun customDialog(
roomId: String,
message: String,
downCount: Int,
status: Int = 1,
event: RoomMessageEvent.T?,
confirm: String = "同意",
cancel: String = "拒绝",
) {
// 创建并显示确认对话框
ConfirmDialog(
ActivityUtils.getTopActivity(),
"提示",
message,
confirm,
cancel,
{ v: View? ->
when (status) {
1 -> {
if (roomId.equals(CommonAppContext.getInstance().playId))
return@ConfirmDialog
RoomManager.getInstance()
.fetchRoomDataAndEnter(ActivityUtils.getTopActivity(), roomId, "", "")
}
}
},
{ v: View? ->
when (status) {
1 -> {
val text = RoomMessageEvent.T()
val json = JSONObject()
json.put("status", "2")
text.text = json.toString()
MessageListenerSingleton.getInstance().sendCustomC2CMessage(
CustomMsgCode.CODE_TASK_APPRENTICE_JOIN_ROOM,
event?.fromUserInfo?.user_id.toString(),
text
)
}
}
}, true, downCount
).show()
}
fun inviteApprenticeTaskTimer() {
TimerManager.scheduleTimer(
CustomMsgCode.CODE_TASK_APPRENTICE_JOIN_ROOM_TIMER_ID,
15,
TimeUnit.SECONDS,
onTimeUp = {
customDialog(
"",
CustomMsgCode.CODE_TASK_APPRENTICE_JOIN_ROOM_MSG_REFUSE,
5,
3,
null,
"知道了",
""
)
})
}
@@ -82,7 +190,7 @@ open class Application : CommonAppContext() {
override fun onNext(t: IndexRecommendRoom) {
LogUtils.e(t)
if (!t.room_id.isNullOrEmpty()) {
showInviteDialog(activity, t)
showInviteDialog(activity, t)
}
}
})
@@ -95,7 +203,7 @@ open class Application : CommonAppContext() {
})
}
fun showInviteDialog(activity: Activity?,t: IndexRecommendRoom) {
fun showInviteDialog(activity: Activity?, t: IndexRecommendRoom) {
if (inviteDialog == null) {
inviteDialog = activity?.let { InviteDialog(it, t) }
}

View File

@@ -1142,5 +1142,9 @@ public abstract class BaseMvpActivity<P extends IPresenter, VDB extends ViewData
startActivity(intent);
}
public void toActivity(Class<?> clazz) {
Intent intent = new Intent(this, clazz);
startActivity(intent);
}
}

View File

@@ -1,13 +1,15 @@
package com.xscm.modulemain.activity.user.activity;
import android.annotation.SuppressLint;
import android.content.Intent;
import android.view.View;
import androidx.recyclerview.widget.GridLayoutManager;
import androidx.recyclerview.widget.LinearLayoutManager;
import com.alibaba.android.arouter.facade.annotation.Route;
import com.blankj.utilcode.util.LogUtils;
import com.xscm.modulemain.Application;
import com.xscm.modulemain.R;
import com.xscm.modulemain.adapter.TaskBoxAdapter;
import com.xscm.modulemain.adapter.TaskDataAdapter;
@@ -19,12 +21,18 @@ import com.xscm.modulemain.activity.user.presenter.DailyTasksPresenter;
import com.xscm.modulemain.BaseMvpActivity;
import com.xscm.modulemain.activity.WebViewActivity;
import com.xscm.modulemain.manager.RoomManager;
import com.xscm.moduleutil.bean.RoomMessageEvent;
import com.xscm.moduleutil.bean.TaskDataBean;
import com.xscm.moduleutil.utils.CustomMsgCode;
import com.xscm.moduleutil.base.WebUrlConstants;
import com.xscm.moduleutil.bean.GiftBoxBean;
import com.xscm.moduleutil.bean.GiftName;
import com.xscm.moduleutil.bean.TaskItem;
import com.xscm.moduleutil.listener.MessageListenerSingleton;
import com.xscm.moduleutil.utils.ARouteConstants;
import com.xscm.moduleutil.utils.ColorManager;
import com.xscm.moduleutil.utils.SpUtil;
import org.json.JSONObject;
import java.util.ArrayList;
import java.util.List;
@@ -46,6 +54,8 @@ public class DailyTasksActivity extends BaseMvpActivity<DailyTasksPresenter, Act
private TaskDataAdapter taskDataAdapter;
private List<GiftBoxBean.TaskDataBean> taskList = new ArrayList<>();
@Override
protected DailyTasksPresenter bindPresenter() {
return new DailyTasksPresenter(this, this);
@@ -78,6 +88,27 @@ public class DailyTasksActivity extends BaseMvpActivity<DailyTasksPresenter, Act
mBinding.rvTask.setLayoutManager(new GridLayoutManager(this, 2, GridLayoutManager.VERTICAL, false));
mBinding.rvTask.setAdapter(mTaskBoxAdapter);
mBinding.rvTaskToday.setLayoutManager(new GridLayoutManager(this, 1));
mTaskDataAdapter = new TaskSectionAdapter(taskList);
mBinding.rvTaskToday.setAdapter(mTaskDataAdapter);
mTaskDataAdapter.setOnItemClickListener(new TaskSectionAdapter.OnItemClickListener() {
@Override
public void onItemClick(GiftBoxBean.TaskDataBean taskItem, GiftBoxBean.TaskDataBean.DailyTasksBean item) {
LogUtils.e("taskStatus:" + item.toString() + "\n taskItem:" + taskItem.toString());
switch (item.getTask_status()) {
case 1://未开始
taskStatus1(item);
break;
case 2://待领取
MvpPre.dailyTasksReceive(item.getTask_id() + "",item.getStudent_id());
break;
case 3://已完成
break;
}
}
});
mBinding.imGz.setOnClickListener(v -> {
Intent intent = new Intent(this, WebViewActivity.class);
@@ -103,44 +134,46 @@ public class DailyTasksActivity extends BaseMvpActivity<DailyTasksPresenter, Act
mBinding.tvTitle.setText("今日累计充值获得金币:" + (giftBoxBean.getUser_gold() != null ? giftBoxBean.getUser_gold() : "0"));
mTaskBoxAdapter.setNewData(giftBoxBean.getGift_box_list());
mBinding.rvTaskToday.setLayoutManager(new GridLayoutManager(this, 1));
// List<TaskItem> sections = new ArrayList<>();
// // 每日任务
// sections.add(new TaskItem("今日任务", giftBoxBean.getTasks().getDaily_tasks()));
// // 特殊任务
// sections.add(new TaskItem("特殊任务", giftBoxBean.getTasks().getDaily_tasks_special()));//
// // 师徒任务
// if (giftBoxBean.getTasks().getTeacher_tasks() != null && giftBoxBean.getTasks().getTeacher_tasks().size() > 0) {
// sections.add(new TaskItem("师徒任务", giftBoxBean.getTasks().getTeacher_tasks()));
// }
//
// // 平台任务
// sections.add(new TaskItem("平台任务", giftBoxBean.getTasks().getUsual_tasks()));
mTaskDataAdapter = new TaskSectionAdapter(giftBoxBean.getTasks());
mBinding.rvTaskToday.setAdapter(mTaskDataAdapter);
mTaskDataAdapter.setOnItemClickListener(new TaskSectionAdapter.OnItemClickListener() {
@Override
public void onItemClick(GiftBoxBean.TaskDataBean taskItem, GiftBoxBean.TaskDataBean.DailyTasksBean item) {
// if (taskItem.getTitle().equals("今日任务") || taskItem.getTitle().equals("平台任务") || taskItem.getTitle().equals("师徒任务")) {
// if (item.getTask_status() == 2) {
// MvpPre.dailyTasksReceive(item.getTask_id() + "");
// }
// } else {
// if (item.getTask_status() == 2) {
// MvpPre.dailyTasksReceive(item.getTask_id() + "");
// } else if (item.getTask_status() == 1) {
// mBinding.coolWaitView.setVisibility(View.VISIBLE);
// RoomManager.getInstance().fetchRoomDataAndEnter(DailyTasksActivity.this, item.getFrom_id(), "", item.getTask_id() + "");
// finish();
// }
// }
}
});
taskList.clear();
giftBoxBean.getTasks().stream()
.filter(task -> !task.getTask_list().isEmpty())
.forEach(taskList::add);
mTaskDataAdapter.notifyDataSetChanged();
}
private void taskStatus1(GiftBoxBean.TaskDataBean.DailyTasksBean item) {
switch (item.getJump_type()) {
case 1:
toActivity(RealNameActivity.class);
break;
case 2:
toActivity(CreateAlbumActivity.class);
break;
case 3:
toActivity(BindCardActivity.class);
break;
case 4:
mBinding.coolWaitView.setVisibility(View.VISIBLE);
MvpPre.taskJumpRoom(item, item.getTask_id() + "");
break;
case 5:
//跳转加入公会
Intent intent = new Intent(DailyTasksActivity.this, WebViewActivity.class);
intent.putExtra("url", String.format(WebUrlConstants.INSTANCE.getWEB_GUILD_URL(), SpUtil.getToken(), ""));
intent.putExtra("title", "公会");
startActivity(intent);
break;
case 6:
toActivity(RechargeActivity.class);
break;
case 0:
break;
}
}
@SuppressLint("CheckResult")
@Override
protected void onPause() {
super.onPause();
@@ -160,4 +193,34 @@ public class DailyTasksActivity extends BaseMvpActivity<DailyTasksPresenter, Act
ToastUtils.show("任务完成");
MvpPre.tasksLihen();
}
@Override
public void taskJumpRoom(GiftBoxBean.TaskDataBean.DailyTasksBean item, String roomId) {
if (item.getFrom_id().equals("0")) {
ToastUtils.show("暂无此类型房间。");
mBinding.coolWaitView.setVisibility(View.GONE);
return;
}
switch (item.getTask_id()) {
case 21:
case 22:
case 23:
RoomMessageEvent.T text = new RoomMessageEvent.T();
try {
JSONObject jsonObject = new JSONObject();
jsonObject.put("status", "1");
jsonObject.put("room_id", roomId);
text.setText(jsonObject.toString());
MessageListenerSingleton.getInstance().sendCustomC2CMessage(
CustomMsgCode.INSTANCE.getCODE_TASK_APPRENTICE_JOIN_ROOM(),
item.getStudent_id(), text);
Application.Companion.getInstance().inviteApprenticeTaskTimer();
}catch (Exception e){
e.printStackTrace();
}
break;
}
RoomManager.getInstance().fetchRoomDataAndEnter(DailyTasksActivity.this, roomId, "", "");
finish();
}
}

View File

@@ -15,6 +15,8 @@ public class DailyTasksConacts {
void dailyTasksOpenBox(GiftName giftName);
void dailyTasksComplete();
void taskJumpRoom(GiftBoxBean.TaskDataBean.DailyTasksBean item,String taskId);
}
public interface IMePre extends IPresenter {
@@ -23,7 +25,9 @@ public class DailyTasksConacts {
void dailyTasksOpenBox(String gift_box_id);
void dailyTasksReceive(String task_id);
void dailyTasksReceive(String task_id,String student_id);
void taskJumpRoom(GiftBoxBean.TaskDataBean.DailyTasksBean item,String roomId);
}
}

View File

@@ -6,6 +6,7 @@ import com.xscm.modulemain.activity.user.conacts.DailyTasksConacts;
import com.xscm.moduleutil.bean.GiftBoxBean;
import com.xscm.moduleutil.bean.GiftName;
import com.xscm.moduleutil.http.BaseObserver;
import com.xscm.moduleutil.http.RetrofitClient;
import com.xscm.moduleutil.presenter.BasePresenter;
import io.reactivex.disposables.Disposable;
@@ -18,7 +19,7 @@ public class DailyTasksPresenter extends BasePresenter<DailyTasksConacts.View> i
@Override
public void tasksLihen() {
api.tasksLihen(new BaseObserver<GiftBoxBean>() {
RetrofitClient.getInstance().tasksLihen(new BaseObserver<GiftBoxBean>() {
@Override
public void onSubscribe(Disposable d) {
addDisposable(d);
@@ -33,7 +34,7 @@ public class DailyTasksPresenter extends BasePresenter<DailyTasksConacts.View> i
@Override
public void dailyTasksOpenBox(String gift_box_id) {
api.dailyTasksOpenBox(gift_box_id, new BaseObserver<GiftName>() {
RetrofitClient.getInstance().dailyTasksOpenBox(gift_box_id, new BaseObserver<GiftName>() {
@Override
public void onSubscribe(Disposable d) {
addDisposable(d);
@@ -47,8 +48,8 @@ public class DailyTasksPresenter extends BasePresenter<DailyTasksConacts.View> i
}
@Override
public void dailyTasksReceive(String task_id) {
api.dailyTasksReceive(task_id, new BaseObserver<String>() {
public void dailyTasksReceive(String task_id,String student_id) {
RetrofitClient.getInstance().dailyTasksReceive(task_id,student_id, new BaseObserver<String>() {
@Override
public void onSubscribe(Disposable d) {
@@ -63,5 +64,21 @@ public class DailyTasksPresenter extends BasePresenter<DailyTasksConacts.View> i
}
@Override
public void taskJumpRoom(GiftBoxBean.TaskDataBean.DailyTasksBean item,String taskId) {
RetrofitClient.getInstance().taskJumpRoomId(taskId, new BaseObserver<String>() {
@Override
public void onSubscribe(Disposable d) {
}
@Override
public void onNext(String s) {
MvpRef.get().taskJumpRoom(item,s);
}
});
}
}

View File

@@ -1,6 +1,8 @@
package com.xscm.modulemain.adapter;
import android.annotation.SuppressLint;
import android.content.res.ColorStateList;
import android.graphics.Color;
import android.text.Spannable;
import android.text.SpannableString;
import android.text.style.ForegroundColorSpan;
@@ -39,13 +41,15 @@ public class TaskBoxAdapter extends BaseQuickAdapter<GiftBoxBean.GiftBean, BaseV
giftName.setText(item.getName());
giftTitle.setText(item.getTitle());
if (position == 0) {
itemView.setBackgroundColor(mContext.getResources().getColor(com.xscm.moduleutil.R.color.color_FCE4ED)); // 红色
itemView.setBackgroundResource(R.drawable.shape_8);
itemView.setBackgroundTintList(ColorStateList.valueOf(Color.parseColor("#FFFCE4ED")));
giftName.setTextColor(mContext.getResources().getColor(com.xscm.moduleutil.R.color.color_E24171));
setSpannableText(giftTitle, "最高可获得%d金币", Integer.parseInt(item.getHighest_gain()),com.xscm.moduleutil.R.color.color_E24171);
ImageUtils.loadSetErrorImg(item.getIcon(), helper.getView(R.id.task_box), com.xscm.moduleutil.R.mipmap.task_cj);
} else if (position == 1) {
itemView.setBackgroundResource(R.drawable.shape_8);
itemView.setBackgroundTintList(ColorStateList.valueOf(Color.parseColor("#FFFDE8AE")));
ImageUtils.loadSetErrorImg(item.getIcon(), helper.getView(R.id.task_box), com.xscm.moduleutil.R.mipmap.task_gj);
itemView.setBackgroundColor(mContext.getResources().getColor(com.xscm.moduleutil.R.color.color_FDE8AE)); // 黄色
giftName.setTextColor(mContext.getResources().getColor(com.xscm.moduleutil.R.color.color_F35F07));
setSpannableText(giftTitle, "最高可获得%d金币", Integer.parseInt(item.getHighest_gain()),com.xscm.moduleutil.R.color.color_F35F07);
@@ -73,11 +77,10 @@ public class TaskBoxAdapter extends BaseQuickAdapter<GiftBoxBean.GiftBean, BaseV
helper.setText(R.id.iv_unlock, item.getStatus_str());
View unlockView = helper.getView(R.id.iv_unlock);
if (item.getStatus().equals("0")){
// helper.setImageDrawable(R.id.iv_unlock, mContext.getResources().getDrawable(com.qxcm.moduleutil.R.mipmap.not_unlocked));
unlockView.setClickable(false);
unlockView.setEnabled(false);
// 可选:改变颜色或透明度来视觉反馈
unlockView.setAlpha(0.9f); // 半透明表示不可点击
unlockView.setAlpha(0.2f); // 半透明表示不可点击
}else if (item.getStatus().equals("1")){
unlockView.setClickable(true);
unlockView.setEnabled(true);
@@ -85,18 +88,10 @@ public class TaskBoxAdapter extends BaseQuickAdapter<GiftBoxBean.GiftBean, BaseV
}else if (item.getStatus().equals("2")){
unlockView.setClickable(false);
unlockView.setEnabled(false);
}
else {
// helper.setImageDrawable(R.id.iv_unlock, mContext.getResources().getDrawable(com.qxcm.moduleutil.R.mipmap.unlocked));
unlockView.setClickable(false);
unlockView.setEnabled(false);
// 可选:改变颜色或透明度来视觉反馈
unlockView.setAlpha(0.8f); // 半透明表示不可点击
unlockView.setAlpha(1.0f); // 恢复正常显示
}
helper.getView(R.id.iv_unlock).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (onItemClickListener != null) {

View File

@@ -33,7 +33,7 @@ public class TaskDataAdapter extends BaseQuickAdapter<GiftBoxBean.TaskDataBean.D
TextView textView1= helper.getView(R.id.task_jb);
if (item.getTask_status()==1){
textView.setText("未完成");
textView.setText(item.getTask_type_str());
}else if (item.getTask_status()==2){
textView.setText("");
textView.setBackgroundResource(com.xscm.moduleutil.R.mipmap.task_lq);
@@ -52,17 +52,12 @@ public class TaskDataAdapter extends BaseQuickAdapter<GiftBoxBean.TaskDataBean.D
// textView.setBackgroundResource(com.xscm.moduleutil.R.mipmap.task_ylq);
// }
if (item.getReward_type()==1){
textView1.setText("金币");
}else if (item.getReward_type()==2){
textView1.setText("钻石");
}
ImageUtils.loadHeadCC(item.getIcon(), helper.getView(R.id.task_pic));
helper.setText(R.id.task_name, item.getTask_name())
.setText(R.id.task_jb_number, "+"+item.getGold_reward());
helper.setText(R.id.task_name, item.getTask_name());
helper.setText(R.id.task_jb_number, item.getReward_str());
helper.getView(R.id.task_type).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (mItemClickLitener!= null){

View File

@@ -22,6 +22,7 @@ public class TaskSectionAdapter extends RecyclerView.Adapter<TaskSectionAdapter.
public TaskSectionAdapter(List<GiftBoxBean.TaskDataBean> sections) {
this.sections = sections;
}
// 定义点击事件接口
public interface OnItemClickListener {
void onItemClick(GiftBoxBean.TaskDataBean taskItem, GiftBoxBean.TaskDataBean.DailyTasksBean item);
@@ -32,6 +33,7 @@ public class TaskSectionAdapter extends RecyclerView.Adapter<TaskSectionAdapter.
public void setOnItemClickListener(OnItemClickListener listener) {
this.listener = listener;
}
@NonNull
@Override
public SectionViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
@@ -42,24 +44,17 @@ public class TaskSectionAdapter extends RecyclerView.Adapter<TaskSectionAdapter.
@Override
public void onBindViewHolder(@NonNull SectionViewHolder holder, int position) {
GiftBoxBean.TaskDataBean section = sections.get(position);
holder.title.setText(section.getTask_type_name());
TaskDataAdapter adapter = new TaskDataAdapter();
holder.recyclerView.setLayoutManager(new LinearLayoutManager(holder.itemView.getContext()));
holder.recyclerView.setAdapter(adapter);
adapter.setNewData(section.getTask_list());
// if (position==2){
// holder.view.setVisibility(View.VISIBLE);
// }else {
// holder.view.setVisibility(View.GONE);
// }
adapter.setItemClickLitener(new TaskDataAdapter.ItemClickLitener() {
@Override
public void onItemClick(View view, int position, GiftBoxBean.TaskDataBean.DailyTasksBean item) {
if (listener!= null) {
listener.onItemClick(section,item);
}
adapter.setItemClickLitener((view, position1, item) -> {
if (listener != null) {
listener.onItemClick(section, item);
}
});
}

View File

@@ -0,0 +1,82 @@
package com.xscm.modulemain.utils
import java.util.concurrent.ConcurrentHashMap
import java.util.concurrent.Executors
import java.util.concurrent.ScheduledFuture
import java.util.concurrent.TimeUnit
/**
* 单例定时器管理类
* 特性:
* 1. 单例模式,全局唯一实例
* 2. 支持多任务管理通过taskId区分
* 3. 时间到触发回调,支持取消指定/所有定时器
* 4. 线程安全,适配多线程场景
*/
object TimerManager {
// 线程安全的ScheduledExecutorService核心线程数1足够处理定时任务
private val scheduler = Executors.newSingleThreadScheduledExecutor()
// 存储定时任务的Future用于取消任务ConcurrentHashMap保证线程安全
private val taskMap = ConcurrentHashMap<String, ScheduledFuture<*>>()
/**
* 启动一个定时任务
* @param taskId 任务唯一标识(用于后续取消)
* @param delay 延迟时间比如5表示5秒/5分钟取决于unit
* @param unit 时间单位TimeUnit.SECONDS/TimeUnit.MILLISECONDS等
* @param onTimeUp 时间到的回调(默认在后台线程执行)
*/
fun scheduleTimer(
taskId: String,
delay: Long,
unit: TimeUnit,
onTimeUp: () -> Unit
) {
// 先取消同名任务(避免重复创建)
if (taskMap.containsKey(taskId)) {
cancelTimer(taskId)
}
// 提交定时任务
val future = scheduler.schedule({
try {
onTimeUp.invoke() // 执行回调
taskMap.remove(taskId) // 执行完自动移除任务记录
} catch (e: Exception) {
// 捕获回调异常,避免影响定时器线程
println("Timer task $taskId callback error: ${e.message}")
}
}, delay, unit)
// 记录任务Future
taskMap[taskId] = future
}
/**
* 取消指定的定时任务
* @param taskId 任务唯一标识
* @return 是否取消成功true=取消成功/任务已执行false=任务不存在)
*/
fun cancelTimer(taskId: String): Boolean {
val future = taskMap.remove(taskId) ?: return false
// mayInterruptIfRunning是否中断正在执行的任务这里设为false避免强制中断
return future.cancel(false)
}
/**
* 取消所有定时任务
*/
fun cancelAllTimers() {
taskMap.values.forEach { it.cancel(false) }
taskMap.clear()
}
/**
* 销毁定时器(应用退出时调用,释放资源)
*/
fun destroy() {
cancelAllTimers()
scheduler.shutdown() // 关闭线程池
}
}