Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Sign in / Register
Toggle navigation
Y
YGOMobile-Cn-Ko-En
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Locked Files
Issues
0
Issues
0
List
Boards
Labels
Service Desk
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Security & Compliance
Security & Compliance
Dependency List
License Compliance
Packages
Packages
List
Container Registry
Analytics
Analytics
CI / CD
Code Review
Insights
Issues
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
fallenstardust
YGOMobile-Cn-Ko-En
Commits
c712acdc
Commit
c712acdc
authored
Nov 30, 2025
by
fallenstardust
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
优化删除判断避免因为空指错误造成在线备份删除失败
parent
a5164af5
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
74 additions
and
46 deletions
+74
-46
mobile/src/main/java/cn/garymb/ygomobile/ui/cards/DeckManagerFragment.java
...ava/cn/garymb/ygomobile/ui/cards/DeckManagerFragment.java
+19
-8
mobile/src/main/java/cn/garymb/ygomobile/ui/cards/deck_square/DeckSquareApiUtil.java
...ymb/ygomobile/ui/cards/deck_square/DeckSquareApiUtil.java
+55
-38
No files found.
mobile/src/main/java/cn/garymb/ygomobile/ui/cards/DeckManagerFragment.java
View file @
c712acdc
...
...
@@ -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
);
}
...
...
mobile/src/main/java/cn/garymb/ygomobile/ui/cards/deck_square/DeckSquareApiUtil.java
View file @
c712acdc
...
...
@@ -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
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment