sim*_*axy 11 android broadcastreceiver android-jobscheduler android-workmanager
我有应用程序需要在设备上连接互联网后立即同步数据。
我在 Worker 类中有同步工作,它工作正常。但是我需要在手机连接互联网后立即运行这个类。由于不推荐和弃用广播接收器的连接更改,我需要一种方法在连接互联网时启动我的课程,以便数据同步。我怎样才能做到这一点?
我还想在用户存在应用程序并保持 Internet 连接状态时安排工作管理器,但是当应用程序从最近关闭时,不会调用 onDestroy。你有什么解决方案或逻辑吗?
小智 10
男孩明白你的意思。您指出的事情是完全正确的,您应该尽量避免广播接收器,因为当今人们拥有大量应用程序,并且在连接互联网后每个应用程序触发请求都会使用户的系统冻结,因为每个应用程序都想发送请求wifi连接后。因此,Android 系统带有 JET PACK,之后您不应执行应用程序的操作,而是向 android 系统请求该操作,它们将处理后台请求。
正如上面提到的赛义德
Constraints constraints = new Constraints.Builder()
.setRequiredNetworkType(NetworkType.CONNECTED)
.build();
OneTimeWorkRequest onetimeJob = new OneTimeWorkRequest.Builder(YourJob.class)
.setConstraints(constraints).build(); // or PeriodicWorkRequest
WorkManager.getInstance().enqueue(onetimeJob);
Run Code Online (Sandbox Code Playgroud)
但是等等,你想在连接互联网时启动工作,所以你想要一些像连接更改的弃用广播之类的东西。你为什么不做一件事?每当用户在前台或后台使用时获得的数据都会触发工作管理器。如果您正在对其进行改造,那么它会在没有互联网连接时返回错误,因此您可以在网络故障时安排作业。
所以你的工作将是
override fun onFailure(call: Call<Chat>, t: Throwable) {
Log.v("chatsyncchecking","sending message failed",t)
if(t is IOException){
Log.v("chatsyncchecking","scheduling chat sync")
(app as App).enqueueChatSync()
}
}
Run Code Online (Sandbox Code Playgroud)
(您可以触发来自应用程序类的每个请求)
因此,无论何时连接互联网,您都不应解雇工作经理,这让您受益匪浅。当某些任务失败时,您只需开火。这也减少了对 android 系统的工作请求。毕竟,我们都是帮助 android 改进的社区,用户可以在手机上获得出色的体验,不会有太多滞后。希望能帮助到你
由于 Android O 及更高版本的新限制,您无法使用清单标志在网络连接处于活动状态后立即启动您的类。但是,只要Workmanager有任何 Internet 连接可用,您就可以告诉您运行您的工作。
为此,您需要定义一个约束:
Constraints constraints = new Constraints.Builder()
.setRequiredNetworkType(NetworkType.CONNECTED)
.build();
Run Code Online (Sandbox Code Playgroud)
然后排队你的工作:
OneTimeWorkRequest onetimeJob = new OneTimeWorkRequest.Builder(YourJob.class)
.setConstraints(constraints).build(); // or PeriodicWorkRequest
WorkManager.getInstance().enqueue(onetimeJob);
Run Code Online (Sandbox Code Playgroud)