下载重试
This commit is contained in:
@@ -60,9 +60,11 @@ class MainActivity : AppCompatActivity() {
|
|||||||
private var retryCount = 0
|
private var retryCount = 0
|
||||||
private val maxRetries = 3
|
private val maxRetries = 3
|
||||||
private var isFirstLaunch = true
|
private var isFirstLaunch = true
|
||||||
private var hasShownNetworkRetryToast = false
|
|
||||||
private var isReverseOrder = false
|
private var isReverseOrder = false
|
||||||
private var isToolbarShowing = false
|
private var isToolbarShowing = false
|
||||||
|
// 下载源重试状态
|
||||||
|
private var downloadRetryCount = 0
|
||||||
|
private val maxDownloadRetries = 6
|
||||||
|
|
||||||
// 频道名消失 Runnable
|
// 频道名消失 Runnable
|
||||||
private val hideChannelNameRunnable = Runnable {
|
private val hideChannelNameRunnable = Runnable {
|
||||||
@@ -81,10 +83,8 @@ class MainActivity : AppCompatActivity() {
|
|||||||
private const val KEY_REVERSE = "reverse_order"
|
private const val KEY_REVERSE = "reverse_order"
|
||||||
private const val TIMEOUT_MS = 3000
|
private const val TIMEOUT_MS = 3000
|
||||||
private const val CHANNEL_NAME_DURATION_MS = 3000L
|
private const val CHANNEL_NAME_DURATION_MS = 3000L
|
||||||
private const val NETWORK_DELAY_MS = 5000L
|
|
||||||
private const val TOOLBAR_DURATION_MS = 5000L
|
private const val TOOLBAR_DURATION_MS = 5000L
|
||||||
private const val LOADING_TIMEOUT_MS = 4000L
|
private const val LOADING_TIMEOUT_MS = 4000L
|
||||||
private const val SWITCH_STATUS_DURATION_MS = 2000L
|
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onCreate(savedInstanceState: Bundle?) {
|
override fun onCreate(savedInstanceState: Bundle?) {
|
||||||
@@ -345,7 +345,7 @@ class MainActivity : AppCompatActivity() {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
hasShownNetworkRetryToast = false
|
downloadRetryCount = 0
|
||||||
|
|
||||||
val channels = ChannelManager.loadChannels(this)
|
val channels = ChannelManager.loadChannels(this)
|
||||||
if (channels.isNotEmpty()) {
|
if (channels.isNotEmpty()) {
|
||||||
@@ -358,12 +358,28 @@ class MainActivity : AppCompatActivity() {
|
|||||||
|
|
||||||
val sourceUrl = ChannelManager.getSavedSourceUrl(this)
|
val sourceUrl = ChannelManager.getSavedSourceUrl(this)
|
||||||
if (sourceUrl != null) {
|
if (sourceUrl != null) {
|
||||||
executor.execute {
|
// 先检查网络是否可用,如果没网就不立即尝试下载
|
||||||
downloadAndUpdateSource(sourceUrl)
|
if (isNetworkAvailable()) {
|
||||||
|
executor.execute {
|
||||||
|
downloadAndUpdateSource(sourceUrl)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// 没网 → 等网络回调
|
||||||
|
if (channels.isEmpty()) {
|
||||||
|
loadingText.text = "等待网络连接后自动下载频道列表..."
|
||||||
|
}
|
||||||
|
// registerNetworkCallback 会在网络连上时自动触发下载
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun isNetworkAvailable(): Boolean {
|
||||||
|
val cm = getSystemService(CONNECTIVITY_SERVICE) as ConnectivityManager
|
||||||
|
val network = cm.activeNetwork ?: return false
|
||||||
|
val caps = cm.getNetworkCapabilities(network) ?: return false
|
||||||
|
return caps.hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
|
||||||
|
}
|
||||||
|
|
||||||
private fun downloadAndUpdateSource(sourceUrl: String) {
|
private fun downloadAndUpdateSource(sourceUrl: String) {
|
||||||
try {
|
try {
|
||||||
val url = URL(sourceUrl)
|
val url = URL(sourceUrl)
|
||||||
@@ -382,6 +398,7 @@ class MainActivity : AppCompatActivity() {
|
|||||||
val channelCountBefore = ChannelManager.getChannelCount()
|
val channelCountBefore = ChannelManager.getChannelCount()
|
||||||
ChannelManager.saveChannels(this, lines)
|
ChannelManager.saveChannels(this, lines)
|
||||||
val newCount = ChannelManager.getChannelCount()
|
val newCount = ChannelManager.getChannelCount()
|
||||||
|
downloadRetryCount = 0 // 成功,重置重试
|
||||||
mainHandler.post {
|
mainHandler.post {
|
||||||
if (channelCountBefore == 0 && newCount > 0) {
|
if (channelCountBefore == 0 && newCount > 0) {
|
||||||
playChannel(ChannelManager.getCurrentChannel()!!)
|
playChannel(ChannelManager.getCurrentChannel()!!)
|
||||||
@@ -398,21 +415,30 @@ class MainActivity : AppCompatActivity() {
|
|||||||
conn.disconnect()
|
conn.disconnect()
|
||||||
} catch (e: Exception) {
|
} catch (e: Exception) {
|
||||||
e.printStackTrace()
|
e.printStackTrace()
|
||||||
if (ChannelManager.getChannelCount() == 0) {
|
downloadRetryCount++
|
||||||
if (!hasShownNetworkRetryToast) {
|
if (downloadRetryCount >= maxDownloadRetries) {
|
||||||
hasShownNetworkRetryToast = true
|
// 达到最大重试次数,停止
|
||||||
mainHandler.post {
|
mainHandler.post {
|
||||||
Toast.makeText(this@MainActivity, "无法连接服务器,将在后台继续尝试...", Toast.LENGTH_LONG).show()
|
if (ChannelManager.getChannelCount() == 0) {
|
||||||
|
loadingText.text = "多次尝试失败,请检查网络或源地址"
|
||||||
|
Toast.makeText(this@MainActivity, "多次尝试下载失败", Toast.LENGTH_LONG).show()
|
||||||
|
} else {
|
||||||
|
Toast.makeText(this@MainActivity, "更新失败,使用缓存", Toast.LENGTH_SHORT).show()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
mainHandler.postDelayed({
|
return
|
||||||
executor.execute { downloadAndUpdateSource(sourceUrl) }
|
}
|
||||||
}, NETWORK_DELAY_MS)
|
// 指数退避:5s → 10s → 20s → 40s → 60s → 120s
|
||||||
} else {
|
val delays = longArrayOf(5000, 10000, 20000, 40000, 60000, 120000)
|
||||||
mainHandler.post {
|
val delay = delays.getOrElse(downloadRetryCount - 1) { 120000L }
|
||||||
Toast.makeText(this@MainActivity, "更新源失败,使用缓存", Toast.LENGTH_SHORT).show()
|
mainHandler.post {
|
||||||
|
if (ChannelManager.getChannelCount() == 0) {
|
||||||
|
loadingText.text = "连接失败,${delay / 1000}秒后重试(${downloadRetryCount}/$maxDownloadRetries)"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
mainHandler.postDelayed({
|
||||||
|
executor.execute { downloadAndUpdateSource(sourceUrl) }
|
||||||
|
}, delay)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -562,7 +588,9 @@ class MainActivity : AppCompatActivity() {
|
|||||||
connectivityManager.registerNetworkCallback(builder.build(), object : ConnectivityManager.NetworkCallback() {
|
connectivityManager.registerNetworkCallback(builder.build(), object : ConnectivityManager.NetworkCallback() {
|
||||||
override fun onAvailable(network: Network) {
|
override fun onAvailable(network: Network) {
|
||||||
val sourceUrl = ChannelManager.getSavedSourceUrl(this@MainActivity)
|
val sourceUrl = ChannelManager.getSavedSourceUrl(this@MainActivity)
|
||||||
if (sourceUrl != null && ChannelManager.getChannelCount() > 0) {
|
if (sourceUrl != null) {
|
||||||
|
// 网络恢复,重置重试计数并尝试下载
|
||||||
|
downloadRetryCount = 0
|
||||||
executor.execute {
|
executor.execute {
|
||||||
downloadAndUpdateSource(sourceUrl)
|
downloadAndUpdateSource(sourceUrl)
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user