在android中连接wifi时如何触发工作管理器?

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 改进的社区,用户可以在手机上获得出色的体验,不会有太多滞后。希望能帮助到你

  • 天啊,你的回答是如此流利,我很喜欢专业记录员写的文章。还有一件事我正在使用改造,这有助于获得好主意。 (2认同)

Sae*_*umi 7

由于 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)

  • 您好,感谢您的回答,感谢这一部分,但我已经做到了这一点,我的工作管理器运行得很好,但我缺少的重要一点是我需要在每次网络连接时运行该工作管理器。那么我应该在哪里排队这个请求呢? (2认同)