我有一个需要在设备连接上互联网后立即同步数据的应用程序。
我已经将同步工作放入Worker类中,并且它正常工作。但是,由于广播接收器的连接更改不被建议且已被弃用,我需要一种方法在手机连接到互联网时运行此类,以便数据得到同步。我如何实现这一点?
我还考虑在用户退出应用程序并保持互联网连接条件时安排工作管理器,但是当从最近关闭应用程序时不会调用onDestroy。您是否有任何解决方案或逻辑?
我有一个需要在设备连接上互联网后立即同步数据的应用程序。
我已经将同步工作放入Worker类中,并且它正常工作。但是,由于广播接收器的连接更改不被建议且已被弃用,我需要一种方法在手机连接到互联网时运行此类,以便数据得到同步。我如何实现这一点?
我还考虑在用户退出应用程序并保持互联网连接条件时安排工作管理器,但是当从最近关闭应用程序时不会调用onDestroy。您是否有任何解决方案或逻辑?
我明白你的意思。
你指出的问题是完全正确的。现在的人们拥有大量应用程序,每个应用程序连接到互联网后都会发送请求,这会导致用户的系统冻结。因此,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改进和让用户享受不卡顿的手机体验的社区。 希望这有所帮助。
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);
PeriodicWorkRequest
来定期执行任务。 - Mohammed Faiyyaz Khatri