如何在Android中当WiFi连接时触发工作管理器?

11

我有一个需要在设备连接上互联网后立即同步数据的应用程序。

我已经将同步工作放入Worker类中,并且它正常工作。但是,由于广播接收器的连接更改不被建议且已被弃用,我需要一种方法在手机连接到互联网时运行此类,以便数据得到同步。我如何实现这一点?

我还考虑在用户退出应用程序并保持互联网连接条件时安排工作管理器,但是当从最近关闭应用程序时不会调用onDestroy。您是否有任何解决方案或逻辑?


1
你可以在 Google Docs 中查看:https://developer.android.com/topic/libraries/architecture/workmanager -> “WorkManager 旨在处理可延迟的任务,即不需要立即运行,并且即使应用程序退出或设备重新启动也需要可靠地运行。” 这意味着请求将被执行,但可能不会立即执行,并且 PeriodicWorkRequest 的最短时间为 15 分钟。 - MrVasilev
1
你好,感谢您的回答。谢谢您提供这部分内容,但我已经完成了这一步骤。我的工作管理器已经完美运行,但我缺少的重要部分是需要在每次网络连接时运行该工作管理器。那么我应该在哪里排队这个请求呢? - simplegalaxy
2个回答

13

我明白你的意思。

你指出的问题是完全正确的。现在的人们拥有大量应用程序,每个应用程序连接到互联网后都会发送请求,这会导致用户的系统冻结。因此,Android系统推出了JET PACK。现在,你不应该执行应用程序的操作,而应该将该操作请求交给Android系统处理并在后台进行。

正如Saeed上面提到的那样,请采用

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);

等等,您想在互联网连接时触发工作,因此您需要一种类似于废弃的广播以进行连接更改。为什么不这样做呢?每当用户处于前台或后台时获取数据时,就会触发工作管理器。如果您正在使用retrofit,则当没有互联网连接时返回错误,因此当失败是由于网络时,您可以安排作业。

因此,您的工作将是

  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()
                 }
             }

(您可以从应用程序类中发出每个请求)

因此,这使您受益,您不应在互联网连接时触发工作管理器。 只有在某些任务失败时才会触发。 这也减少了对Android系统的工作请求。 毕竟,我们都是帮助Android改进和让用户享受不卡顿的手机体验的社区。 希望这有所帮助。


2
哦,你的回答非常流利,讓我感受到了一位專業文檔編寫者的風範。還有,我使用了Retrofit,這幫助我得到了很好的想法。 - simplegalaxy

9
由于Android O及以上版本的新限制,使用清单标志后网络连接建立后不能立即启动你的类。但是,你可以告诉Workmanager在任何Internet连接可用时立即运行你的任务。
要实现这一点,您需要定义一个约束条件:
 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);

2
你好,感谢您的回答。谢谢您提供这部分内容,但我已经完成了这一步骤。我的工作管理器已经完美运行,但我缺少的重要部分是需要在每次网络连接时运行该工作管理器。那么我应该在哪里排队这个请求呢? - simplegalaxy
1
@simplegalaxy,你的意思是每次连接网络时都要调用这个作业吗? - Saeed Masoumi
@SaeedMasoumi,根据您的回复,这个任务会在每次网络连接时被调用吗? - William
@simplegalaxy 曾经需要使用带有网络限制的 PeriodicWorkRequest 来定期执行任务。 - Mohammed Faiyyaz Khatri
@SaeedMasoumi 有没有办法通过事件来触发工作呢?比如每次图像保存到手机时?谢谢。 - g g

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接