记录网络切换时同步操作
之前写项目一直都是用户进入界面加载数据,遇到无网、或者网络不稳定导致数据加载不出来的情况,要么给测试说退出重进,了不起给添加一个重试的按钮。
最近一个地图项目,加载收藏点、搜索历史、选择当前车辆等的同步,需要考虑到用户操作时无网,或者操作失败。在用户有网时的状态同步。
从简单版本 一直优化到 目前感觉比较完善的版本,记录下
首先:使用广播监听用户网络状态变化
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任务是在独立的进程中运行的,这有助于减少应用程序的内存占用和崩溃风险。
适用场景:适用于需要在后台执行周期性任务或一次性任务(如数据同步、文件处理等)的场景