diff --git a/app/src/main/java/cn/flyzxf/FengTv/MainActivity.kt b/app/src/main/java/cn/flyzxf/FengTv/MainActivity.kt index 483a6bb..d2f0fcb 100644 --- a/app/src/main/java/cn/flyzxf/FengTv/MainActivity.kt +++ b/app/src/main/java/cn/flyzxf/FengTv/MainActivity.kt @@ -60,9 +60,11 @@ class MainActivity : AppCompatActivity() { private var retryCount = 0 private val maxRetries = 3 private var isFirstLaunch = true - private var hasShownNetworkRetryToast = false private var isReverseOrder = false private var isToolbarShowing = false + // 下载源重试状态 + private var downloadRetryCount = 0 + private val maxDownloadRetries = 6 // 频道名消失 Runnable private val hideChannelNameRunnable = Runnable { @@ -81,10 +83,8 @@ class MainActivity : AppCompatActivity() { private const val KEY_REVERSE = "reverse_order" private const val TIMEOUT_MS = 3000 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 LOADING_TIMEOUT_MS = 4000L - private const val SWITCH_STATUS_DURATION_MS = 2000L } override fun onCreate(savedInstanceState: Bundle?) { @@ -345,7 +345,7 @@ class MainActivity : AppCompatActivity() { return } - hasShownNetworkRetryToast = false + downloadRetryCount = 0 val channels = ChannelManager.loadChannels(this) if (channels.isNotEmpty()) { @@ -358,12 +358,28 @@ class MainActivity : AppCompatActivity() { val sourceUrl = ChannelManager.getSavedSourceUrl(this) 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) { try { val url = URL(sourceUrl) @@ -382,6 +398,7 @@ class MainActivity : AppCompatActivity() { val channelCountBefore = ChannelManager.getChannelCount() ChannelManager.saveChannels(this, lines) val newCount = ChannelManager.getChannelCount() + downloadRetryCount = 0 // 成功,重置重试 mainHandler.post { if (channelCountBefore == 0 && newCount > 0) { playChannel(ChannelManager.getCurrentChannel()!!) @@ -398,21 +415,30 @@ class MainActivity : AppCompatActivity() { conn.disconnect() } catch (e: Exception) { e.printStackTrace() - if (ChannelManager.getChannelCount() == 0) { - if (!hasShownNetworkRetryToast) { - hasShownNetworkRetryToast = true - mainHandler.post { - Toast.makeText(this@MainActivity, "无法连接服务器,将在后台继续尝试...", Toast.LENGTH_LONG).show() + downloadRetryCount++ + if (downloadRetryCount >= maxDownloadRetries) { + // 达到最大重试次数,停止 + mainHandler.post { + 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({ - executor.execute { downloadAndUpdateSource(sourceUrl) } - }, NETWORK_DELAY_MS) - } else { - mainHandler.post { - Toast.makeText(this@MainActivity, "更新源失败,使用缓存", Toast.LENGTH_SHORT).show() + return + } + // 指数退避:5s → 10s → 20s → 40s → 60s → 120s + val delays = longArrayOf(5000, 10000, 20000, 40000, 60000, 120000) + val delay = delays.getOrElse(downloadRetryCount - 1) { 120000L } + 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() { override fun onAvailable(network: Network) { val sourceUrl = ChannelManager.getSavedSourceUrl(this@MainActivity) - if (sourceUrl != null && ChannelManager.getChannelCount() > 0) { + if (sourceUrl != null) { + // 网络恢复,重置重试计数并尝试下载 + downloadRetryCount = 0 executor.execute { downloadAndUpdateSource(sourceUrl) }