当前位置: 首页 > news >正文

记录网络切换时同步操作

之前写项目一直都是用户进入界面加载数据,遇到无网、或者网络不稳定导致数据加载不出来的情况,要么给测试说退出重进,了不起给添加一个重试的按钮。

最近一个地图项目,加载收藏点、搜索历史、选择当前车辆等的同步,需要考虑到用户操作时无网,或者操作失败。在用户有网时的状态同步。

从简单版本 一直优化到 目前感觉比较完善的版本,记录下 

首先:使用广播监听用户网络状态变化

public void initNetWorkChange() {// 动态注册广播接收器networkChangeReceiver = new NetworkChangeReceiver();IntentFilter filter = new IntentFilter();filter.addAction(ConnectivityManager.CONNECTIVITY_ACTION);registerReceiver(networkChangeReceiver, filter);
}
protected void onResume() {
// 监听广播
if (!isReceiverRegistered) {initNetWorkChange();isReceiverRegistered = true;
}
}

NetworkChangeReceiver 里的监听操作

public class NetworkChangeReceiver extends BroadcastReceiver {// 防抖动延迟时间(单位:毫秒)private static final long DEBOUNCE_DELAY = 3000;// 用于防止多次触发private static long lastTriggeredTime = 0;@Overridepublic void onReceive(final Context context, final Intent intent) {boolean isConnected = AppUtil.isConnectedToInternet(context);LogUtils.e("Network connected: " + isConnected);if (isConnected) {long now = System.currentTimeMillis();// 简单防抖: 一定时间内只响应一次if (now - lastTriggeredTime > DEBOUNCE_DELAY) {lastTriggeredTime = now;// 使用WorkManager异步执行,避免主线程阻塞和ANRNetworkSyncWorker.schedule(context);} else {LogUtils.e("NetworkChangeReceiver: ignore duplicate trigger");}}}
}

执行具体任务的  NetworkSyncWorke

public class NetworkSyncWorker extends Worker {public NetworkSyncWorker(@NonNull Context context, @NonNull WorkerParameters params) {super(context, params);}@NonNull@Overridepublic Result doWork() {try {//搜索历史记录相关syncHistory();//车辆管理相关syncVehicleType();return Result.success();} catch (Throwable e ) {e.printStackTrace();return Result.retry();}}/*** 车辆同步*/private void syncVehicleType() throws IOException {}/*** 历史记录*/private void syncHistory() throws IOException {}// 调用入口public static void schedule(Context context) {OneTimeWorkRequest request = new OneTimeWorkRequest.Builder(NetworkSyncWorker.class).build();WorkManager.getInstance(context).enqueue(request);}
}

 Woker简单介绍

定义:Worker是Android Jetpack库中的一个组件,专门用于在后台执行一次性或周期性的任务。


特点:Worker类提供了简单的API来定义任务,并自动处理任务的生命周期(如开始、进行中、完成等)。它支持任务的重试、取消和进度更新等功能。此外,Worker任务是在独立的进程中运行的,这有助于减少应用程序的内存占用和崩溃风险。


适用场景:适用于需要在后台执行周期性任务或一次性任务(如数据同步、文件处理等)的场景

http://www.dtcms.com/a/279859.html

相关文章:

  • TypeScript 配置全解析:tsconfig.json、tsconfig.app.json 与 tsconfig.node.json 的深度指南
  • JJ20 Final Lap演唱会纪念票根生成工具
  • 信息收集的基本流程
  • 大模型呼叫系统选型指南
  • 【Linux】Linux 操作系统 - 28 , 进程间通信(四) -- IPC 资源的管理方式_信号量_临界区等基本概念介绍
  • 递推预处理floor(log_2{n})
  • Class9简洁实现
  • HashMap的put过程以及hashMap的简单介绍
  • kt 中商品的金额字段使用double 还是 bigdecimal
  • 动态规划题解——最长递增子序列【LeetCode】记忆化搜索方法
  • 【每日刷题】杨辉三角
  • Git根据标签Tag强制回滚版本
  • 面试常问:如何在一个长度为n的无序数据快速获取前k个数值
  • 网络传输过程
  • GaussDB between的用法
  • 光伏板如何最大化铺设?
  • 【PostgreSQL异常解决】`PostgreSQL`异常之类型转换错误
  • 记录自己在将python文件变成可访问库文件是碰到的问题
  • vert.x 官网docs, vert.x中文文档地址 vertx文档
  • 文心4.5开源之路:引领技术开放新时代!
  • 【前端:Typst】--let关键字的用法
  • 高德开放平台携手阿里云,面向开发者推出地图服务产品MCP Server
  • 外部协作不力影响项目进度,如何加强外部沟通
  • 项目进度压缩影响质量,如何平衡进度与质量
  • LeetCode|Day11|557. 反转字符串中的单词 III|Python刷题笔记
  • 稀土化合物:助力高效种植与健康养殖
  • vue笔记3 VueRouter VueX详细讲解
  • 对象的使用
  • CAN终端电阻为什么是60R+60R,而不直接用120R?
  • 前端vue对接海康摄像头流程