Commit c712acdc authored by fallenstardust's avatar fallenstardust

优化删除判断避免因为空指错误造成在线备份删除失败

parent a5164af5
......@@ -599,7 +599,14 @@ public class DeckManagerFragment extends BaseFragemnt implements RecyclerViewIte
// 关闭加载对话框并设置当前卡牌包
dlg.dismiss();
// 根据资源路径判断是否进入卡包展示模式
isPackMode = rs.source.getParent().equals(mSettings.getPackDeckDir()) || rs.source.getParent().equals(mSettings.getCacheDeckDir());
if (rs != null && rs.source != null) {
String parentPath = rs.source.getParent();
isPackMode = parentPath != null &&
(parentPath.equals(mSettings.getPackDeckDir()) ||
parentPath.equals(mSettings.getCacheDeckDir()));
} else {
isPackMode = false;
}
setCurDeck(rs, isPackMode);
});
}
......@@ -652,7 +659,7 @@ public class DeckManagerFragment extends BaseFragemnt implements RecyclerViewIte
mCardSearcher.initItems();
initLimitListSpinners(mLimitSpinner, mCardLoader.getLimitList());
// 根据资源路径判断是否进入卡包展示模式
if (rs.source != null) {
if (rs != null && rs.source != null) {
String parentPath = rs.source.getParent();
isPackMode = parentPath != null &&
(parentPath.equals(mSettings.getPackDeckDir()) ||
......@@ -661,7 +668,7 @@ public class DeckManagerFragment extends BaseFragemnt implements RecyclerViewIte
isPackMode = false;
}
// 设置当前卡组显示
if (rs.source != null) {
if (rs != null && rs.source != null) {
setCurDeck(rs, isPackMode);
} else {
setCurDeck(rs, false);
......@@ -1266,11 +1273,13 @@ public class DeckManagerFragment extends BaseFragemnt implements RecyclerViewIte
builder.setMessageGravity(Gravity.CENTER_HORIZONTAL);
builder.setLeftButtonListener((dlg, rs) -> {
if (mDeckAdapater.getYdkFile() != null) {
FileUtils.deleteFile(mDeckAdapater.getYdkFile());
// 统一调用批量删除在线卡组(这里只有1个)
// 先删除在线卡组
List<DeckFile> deckFileList = new ArrayList<>();
deckFileList.add(new DeckFile(mDeckAdapater.getYdkFile()));
onDeckDel(deckFileList);
DeckSquareApiUtil.deleteDecks(deckFileList);
// 再删除本地文件
FileUtils.deleteFile(mDeckAdapater.getYdkFile());
YGOUtil.showTextToast(R.string.done);
dlg.dismiss();
File file = getFirstYdk();
......@@ -1770,7 +1779,7 @@ public class DeckManagerFragment extends BaseFragemnt implements RecyclerViewIte
return;
String currentDeckPath = deck.getAbsolutePath();
for (DeckFile deckFile : deckFileList) {
LogUtil.w(TAG, "要删除的卡组:" + "\n卡组分类" + deckFile.getTypeName() + "\n卡组名称:" + deckFile.getFileName() + "\n卡组id" + deckFile.getDeckId());
LogUtil.w(TAG, "要删除的卡组:" + "\n卡组分类: " + deckFile.getTypeName() + "\n卡组名称:" + deckFile.getFileName() + "\n卡组id: " + deckFile.getDeckId());
if (TextUtils.equals(deckFile.getPath(), currentDeckPath)) {
List<File> files = getYdkFiles();
File file = null;
......@@ -1782,10 +1791,12 @@ public class DeckManagerFragment extends BaseFragemnt implements RecyclerViewIte
} else {
setCurDeck(new DeckInfo(), false);
}
// 对于当前卡组,也应该删除在线卡组
DeckSquareApiUtil.deleteDecks(Arrays.asList(deckFile));
return;
}
}
//删除在线的同名卡组们
// 删除在线的同名卡组们
DeckSquareApiUtil.deleteDecks(deckFileList);
YGOUtil.showTextToast(R.string.done);
}
......
......@@ -6,13 +6,14 @@ import android.widget.Toast;
import com.google.gson.Gson;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.stream.Collectors;
import cn.garymb.ygomobile.AppsSettings;
import cn.garymb.ygomobile.Constants;
......@@ -275,7 +276,7 @@ public class DeckSquareApiUtil {
deckContent = DeckSquareFileUtil.setDeckId(item.getDeckPath(), loginToken.getUserId(), item.getDeckId());
}
data.setDeckYdk(deckContent);
LogUtil.w(TAG, "*要上传的* 本地卡组:" + data.getDeckType() + "、" + data.getDeckName() + "++id: " + data.getDeckId());
LogUtil.w(TAG, "*要上传的* 本地卡组:" + data.getDeckType() + "、" + data.getDeckName() + "++id: " + data.getDeckId() + " " + data.isDelete());
dataList.add(data);
}
return pushMultiDecks(dataList, loginToken);
......@@ -447,13 +448,13 @@ public class DeckSquareApiUtil {
localDeck.setDeckName(localDeckName);
localDeck.setDeckCoverCard1(DeckUtil.getFirstCardCode(localDeck.getDeckPath()));
localDeck.setDelete(false);
LogUtil.d(TAG,"本地卡组名称:"+localDeck.getDeckType()+"-"+localDeck.getDeckName()+" ID:"+localDeck.getDeckId());
LogUtil.d(TAG, "本地卡组名称:" + localDeck.getDeckType() + "-" + localDeck.getDeckName() + " ID:" + localDeck.getDeckId());
// 2. 使用在线卡组的迭代器遍历(支持安全删除)
Iterator<MyOnlineDeckDetail> onlineIterator = onlineDecks.iterator();
while (onlineIterator.hasNext()) {
MyOnlineDeckDetail onlineDeck = onlineIterator.next();
String onLineDeckName = onlineDeck.getDeckName().replace(Constants.YDK_FILE_EX, "");
LogUtil.e(TAG,"在线备份名称:"+onlineDeck.getDeckType()+"/"+onLineDeckName+" 在线卡组ID:"+onlineDeck.getDeckId());
LogUtil.e(TAG, "在线备份名称:" + onlineDeck.getDeckType() + "/" + onLineDeckName + " 在线卡组ID:" + onlineDeck.getDeckId());
// 匹配到同名卡组:加入同步上传列表,并从原始集合中删除(避免重复处理)
if (localDeckName.equals(onLineDeckName)) {// && localDeck.getDeckType().equals(onlineDeck.getDeckType())
localDeck.setDeckId(onlineDeck.getDeckId());
......@@ -507,50 +508,66 @@ public class DeckSquareApiUtil {
return;
}
if (SharedPreferenceUtil.getServerToken() != null) {
LoginToken loginToken = new LoginToken(
SharedPreferenceUtil.getServerUserId(),
SharedPreferenceUtil.getServerToken()
);
String serverToken = SharedPreferenceUtil.getServerToken();
if (serverToken == null) {
LogUtil.w(TAG, "服务器 Token 无效,无法执行删除操作");
return;
}
VUiKit.defer().when(() -> {
List<MyOnlineDeckDetail> originalData = DeckManagerFragment.getOriginalData();
LoginToken loginToken = new LoginToken(
SharedPreferenceUtil.getServerUserId(),
serverToken
);
VUiKit.defer().when(() -> {
List<MyOnlineDeckDetail> originalData = DeckManagerFragment.getOriginalData();
synchronized (originalData) {
if (originalData.isEmpty()) {
MyDeckResponse result = DeckSquareApiUtil.getUserDecks(loginToken);
if (result != null && result.getData() != null) {
originalData.addAll(result.getData());
} else {
throw new RuntimeException("获取用户卡组信息失败");
}
}
synchronized (originalData) { // 加锁防止并发修改
if (originalData.isEmpty()) {
MyDeckResponse result = DeckSquareApiUtil.getUserDecks(loginToken);
if (result != null && result.getData() != null) {
originalData.addAll(result.getData());
}
// 提前过滤掉 null 元素
List<DeckFile> validDeckFiles = deckFileList.stream()
.filter(Objects::nonNull)
.collect(Collectors.toList());
for (DeckFile deleteDeckFile : validDeckFiles) {
String name = deleteDeckFile.getName();
String typeName = deleteDeckFile.getTypeName();
if (name == null || typeName == null) {
LogUtil.w(TAG, "跳过无效卡组文件: name=" + name + ", type=" + typeName);
continue;
}
for (DeckFile deleteDeckFile : deckFileList) {
if (deleteDeckFile == null) continue;
LogUtil.d(TAG, "准备删除卡组:" + typeName + "/" + name);
for (MyOnlineDeckDetail onlineDeckDetail : originalData) {
if (deleteDeckFile.getName() != null &&
deleteDeckFile.getTypeName() != null &&
deleteDeckFile.getName().equals(onlineDeckDetail.getDeckName()) &&
deleteDeckFile.getTypeName().equals(onlineDeckDetail.getDeckType())) {
for (MyOnlineDeckDetail onlineDeckDetail : originalData) {
if (name.equals(onlineDeckDetail.getDeckName()) &&
typeName.equals(onlineDeckDetail.getDeckType())) {
onlineDeckDetail.setDelete(true);
deleteDeckFile.setDeckId(onlineDeckDetail.getDeckId());
break; // 匹配成功即跳出内层循环
}
onlineDeckDetail.setDelete(true);
deleteDeckFile.setDeckId(onlineDeckDetail.getDeckId());
break;
}
}
}
}
syncMyDecks(toDeckItemList(originalData), loginToken);
return true;
}).fail((e) -> {
LogUtil.e(TAG, "删除卡组失败!", e); // 增强日志输出
}).done((result) -> {
LogUtil.d(TAG, "卡组删除同步成功");
});
} else {
LogUtil.w(TAG, "服务器 Token 无效,无法执行删除操作");
}
syncMyDecks(toDeckItemList(originalData), loginToken);
return true;
}).fail((e) -> {
LogUtil.e(TAG, "删除卡组失败!", e);
}).done((result) -> {
LogUtil.d(TAG, "卡组删除同步成功");
});
}
}
\ 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