移动端网络断了怎么办?手把手教你实现自动重连

刷微信时突然卡住,地图加载不出位置,视频刚点播放就提示“网络异常”——这些情况你肯定不陌生。其实不是手机坏了,而是网络临时掉了。很多 App 表面看着没反应,背后早悄悄试着重连好几次了。今天就聊聊移动端里,怎么让 App 自己“爬起来再试一次”。

为什么不能等用户手动刷新?

地铁进隧道、电梯里、商场角落……这些地方信号忽强忽弱,人一走动,Wi-Fi 切换到蜂窝、蜂窝又切回 Wi-Fi,连接断开可能只有 1~3 秒。如果每次断网都弹个框让用户点“重试”,体验直接掉一半。聪明的做法是:静默检测 + 快速恢复。

最简单的重连逻辑长这样

以 Android 上用 OkHttp 为例,网络请求失败后,不立刻报错,而是加个延迟再试一次:

private void makeRequestWithRetry(String url) {
int maxRetries = 3;
for (int i = 0; i < maxRetries; i++) {
try {
Response response = client.newCall(request).execute();
if (response.isSuccessful()) {
handleSuccess(response);
return;
}
} catch (IOException e) {
// 网络异常,准备重试
}
if (i < maxRetries - 1) {
try {
Thread.sleep(800 * (i + 1)); // 指数退避:800ms、1600ms、2400ms
} catch (InterruptedException ignored) {}
}
}
showErrorToast("网络好像不太稳,稍后再试试");
}

更靠谱的做法:监听网络状态变化

光靠重试还不够。比如用户刚连上 Wi-Fi,App 应该主动把之前失败的请求补上。Android 可用 ConnectivityManager 监听网络切换;iOS 用 NWPathMonitor。简单示例(Android):

ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkRequest request = new NetworkRequest.Builder()
.addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
.build();
cm.registerNetworkCallback(request, new ConnectivityManager.NetworkCallback() {
@Override
public void onAvailable(@NonNull Network network) {
// 网络回来了,触发待重发队列
retryPendingRequests();
}
});

别忘了给用户一点“反馈感”

全静默也不行。用户盯着屏幕等结果,没动静容易以为卡死了。建议加个轻量提示:比如列表顶部滑出一行小字“正在重连…”,或者按钮变成“重试中(2/3)”。成功了就自动收起,失败三次再弹 Toast。既不打扰,又让人心里有底。

真实场景小提醒

• 切后台时别盲目重连:App 在后台被系统限频,硬重试可能失败还耗电。
• 登录态失效要单独处理:重连成功但 token 过期了,得先刷新 token 再重发原请求。
• 不是所有请求都值得重试:发评论、提交订单这类操作,重复提交会出问题,必须加幂等校验或禁用重试。

说到底,网络重连不是“多试几次就行”,而是判断什么时候该试、试几次、试完怎么交待。写对了,用户根本感觉不到断过网。