Commit 5ce00443 authored by fallenstardust's avatar fallenstardust

已添加对 deckFileList 的空值和元素有效性判断;

使用 synchronized 关键字确保对 originalData 的线程安全访问;
日志增强以便于排查问题;
添加了提前退出条件和循环控制优化性能;
parent 047a42e4
package cn.garymb.ygomobile.ui.cards.deck_square; package cn.garymb.ygomobile.ui.cards.deck_square;
import static cn.garymb.ygomobile.ui.cards.DeckManagerFragment.originalData;
import static cn.garymb.ygomobile.ui.cards.deck_square.DeckSquareFileUtil.toDeckItemList; import static cn.garymb.ygomobile.ui.cards.deck_square.DeckSquareFileUtil.toDeckItemList;
import android.widget.Toast; import android.widget.Toast;
...@@ -64,7 +63,6 @@ public class DeckSquareApiUtil { ...@@ -64,7 +63,6 @@ public class DeckSquareApiUtil {
/** /**
* 如果未登录(不存在token),显示toast提示用户。如果已登录,返回token * 如果未登录(不存在token),显示toast提示用户。如果已登录,返回token
*
*/ */
public static LoginToken getLoginData() { public static LoginToken getLoginData() {
String serverToken = SharedPreferenceUtil.getServerToken(); String serverToken = SharedPreferenceUtil.getServerToken();
...@@ -521,41 +519,55 @@ public class DeckSquareApiUtil { ...@@ -521,41 +519,55 @@ public class DeckSquareApiUtil {
} }
public static void deleteDecks(List<DeckFile> deckFileList) { public static void deleteDecks(List<DeckFile> deckFileList) {
if (deckFileList == null || deckFileList.isEmpty()) {
LogUtil.w(TAG, "尝试删除卡组但列表为空");
return;
}
if (SharedPreferenceUtil.getServerToken() != null) { if (SharedPreferenceUtil.getServerToken() != null) {
LoginToken loginToken = new LoginToken( LoginToken loginToken = new LoginToken(
SharedPreferenceUtil.getServerUserId(), SharedPreferenceUtil.getServerUserId(),
SharedPreferenceUtil.getServerToken() SharedPreferenceUtil.getServerToken()
); );
// 使用VUiKit避开UI线程进行网络请求
VUiKit.defer().when(() -> { VUiKit.defer().when(() -> {
// 先判断缓存表是否需要更新 List<MyOnlineDeckDetail> originalData = DeckManagerFragment.getOriginalData();
if (DeckManagerFragment.getOriginalData().isEmpty()) {
// 同步获取在线卡组列表(在后台线程中可以安全执行网络操作) synchronized (originalData) { // 加锁防止并发修改
MyDeckResponse result = DeckSquareApiUtil.getUserDecks(loginToken); if (originalData.isEmpty()) {
if (result != null && result.getData() != null) { MyDeckResponse result = DeckSquareApiUtil.getUserDecks(loginToken);
DeckManagerFragment.getOriginalData().addAll(result.getData()); if (result != null && result.getData() != null) {
originalData.addAll(result.getData());
}
} }
}
// 处理删除标记
for (DeckFile deleteDeckFile : deckFileList) {
for (MyOnlineDeckDetail onlineDeckDetail : originalData) {
if (deleteDeckFile.getName().equals(onlineDeckDetail.getDeckName())
&& deleteDeckFile.getTypeName().equals(onlineDeckDetail.getDeckType())) {
onlineDeckDetail.setDelete(true); for (DeckFile deleteDeckFile : deckFileList) {
if (deleteDeckFile == null) continue;
for (MyOnlineDeckDetail onlineDeckDetail : originalData) {
if (deleteDeckFile.getName() != null &&
deleteDeckFile.getTypeName() != null &&
deleteDeckFile.getName().equals(onlineDeckDetail.getDeckName()) &&
deleteDeckFile.getTypeName().equals(onlineDeckDetail.getDeckType())) {
deleteDeckFile.setDeckId(onlineDeckDetail.getDeckId()); onlineDeckDetail.setDelete(true);
deleteDeckFile.setDeckId(onlineDeckDetail.getDeckId());
break; // 匹配成功即跳出内层循环
}
} }
} }
} }
// 执行同步操作(在UI线程不得不进行网络请求,须转在后台线程)
syncMyDecks(toDeckItemList(originalData), loginToken); syncMyDecks(toDeckItemList(originalData), loginToken);
return true; return true;
}).fail((e) -> { }).fail((e) -> {
LogUtil.e(TAG, "删除卡组失败! 原因:" + e); LogUtil.e(TAG, "删除卡组失败!", e); // 增强日志输出
}).done((result) -> { }).done((result) -> {
LogUtil.d(TAG, "卡组删除同步成功"); LogUtil.d(TAG, "卡组删除同步成功");
}); });
} else {
LogUtil.w(TAG, "服务器 Token 无效,无法执行删除操作");
} }
} }
} }
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment