Java 每次internet可用时运行worker
我正在开发一个Android应用程序,每次用户打开Wi-Fi或移动数据时,我都会使用Firebase JobDispatcher库来运行后台作业,但不幸的是,该库已被弃用,现在新的WorkerManager即将问世 我的问题是如何在每次互联网可用时使用WorkerManager运行作业 我已经查看了WorkerManager库迁移指南和文档,但使用OneTimeWorkRequest或PeriodicWorkRequest无法实现这一点 以下是我与Firebase JobDispatcher库一起使用的代码,以实现这一点Java 每次internet可用时运行worker,java,android,android-jobscheduler,android-workmanager,jobservice,Java,Android,Android Jobscheduler,Android Workmanager,Jobservice,我正在开发一个Android应用程序,每次用户打开Wi-Fi或移动数据时,我都会使用Firebase JobDispatcher库来运行后台作业,但不幸的是,该库已被弃用,现在新的WorkerManager即将问世 我的问题是如何在每次互联网可用时使用WorkerManager运行作业 我已经查看了WorkerManager库迁移指南和文档,但使用OneTimeWorkRequest或PeriodicWorkRequest无法实现这一点 以下是我与Firebase JobDispatcher库一
FirebaseJobDispatcher dispatcher = new FirebaseJobDispatcher(new GooglePlayDriver(this));
Job networkJob = dispatcher.newJobBuilder()
.setService(NetworkJobService.class)
.setTag(Const.NETWORK_JOB_TAG)
.setReplaceCurrent(true)
.setLifetime(Lifetime.FOREVER)
.setRetryStrategy(RetryStrategy.DEFAULT_LINEAR)
.setRecurring(true)
.setTrigger(Trigger.executionWindow(0, 0))
.setConstraints(Constraint.ON_ANY_NETWORK)
.build();
dispatcher.schedule(networkJob);
最好一次启动work manager,并使用检查为的网络类型设置约束
Workmanager的doWork()中可用的连接,而不是调用work manager
一次又一次
试试这个解决方案
导入工作经理
然后启动Worker
类
PeriodicWorkRequest periodicWorkRequest = new PeriodicWorkRequest.Builder(WorkManagerDemo.class, 15, TimeUnit.MINUTES)
.addTag("WorkManagerDemo").setConstraints(new Constraints.Builder()
.setRequiredNetworkType(NetworkType.CONNECTED)
.build();
WorkManager.getInstance().enqueueUniquePeriodicWork("WorkManagerDemo", ExistingPeriodicWorkPolicy.KEEP, periodicWorkRequest);
其中WorkManagerDemo
类是
import android.content.Context;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.support.annotation.NonNull;
import androidx.work.Worker;
import androidx.work.WorkerParameters;
public class WorkManagerDemo extends Worker {
public WorkManagerDemo(@NonNull Context context, @NonNull WorkerParameters workerParams) {
super(context, workerParams);
}
@NonNull
@Override
public Result doWork() {
//do your work here
return Result.success();
}
}
最好一次启动work manager,并使用检查为的网络类型设置约束
Workmanager的doWork()中可用的连接,而不是调用work manager
一次又一次
试试这个解决方案
导入工作经理
然后启动Worker
类
PeriodicWorkRequest periodicWorkRequest = new PeriodicWorkRequest.Builder(WorkManagerDemo.class, 15, TimeUnit.MINUTES)
.addTag("WorkManagerDemo").setConstraints(new Constraints.Builder()
.setRequiredNetworkType(NetworkType.CONNECTED)
.build();
WorkManager.getInstance().enqueueUniquePeriodicWork("WorkManagerDemo", ExistingPeriodicWorkPolicy.KEEP, periodicWorkRequest);
其中WorkManagerDemo
类是
import android.content.Context;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.support.annotation.NonNull;
import androidx.work.Worker;
import androidx.work.WorkerParameters;
public class WorkManagerDemo extends Worker {
public WorkManagerDemo(@NonNull Context context, @NonNull WorkerParameters workerParams) {
super(context, workerParams);
}
@NonNull
@Override
public Result doWork() {
//do your work here
return Result.success();
}
}
正式WorkManager文档包括一个用于将应用程序从Firebase JobDispatcher转换为WorkManager的文档 关键点是WorkManager允许以与Firebase JobDispatcher类似的方式设置您的
工作请求
:
Constraints constraints = new Constraints.Builder()
// The Worker needs Network connectivity
.setRequiredNetworkType(NetworkType.CONNECTED)
.build();
PeriodicWorkRequest request =
// Executes MyWorker every 15 minutes
new PeriodicWorkRequest.Builder(MyWorker.class, 15, TimeUnit.MINUTES)
// Sets the input data for the ListenableWorker
.setConstraints(constraints)
.build();
当有连接时,每15分钟(最小间隔)执行一次worker。你必须考虑的另一个限制是,工人不能运行超过10分钟。在此间隔之后,操作系统将停止您的工作进程
这两个限制都来自Android框架中的底层JobScheduler API。官方WorkManager文档包括一个用于将应用程序从Firebase JobDispatcher转换为WorkManager的应用程序 关键点是WorkManager允许以与Firebase JobDispatcher类似的方式设置您的
工作请求
:
Constraints constraints = new Constraints.Builder()
// The Worker needs Network connectivity
.setRequiredNetworkType(NetworkType.CONNECTED)
.build();
PeriodicWorkRequest request =
// Executes MyWorker every 15 minutes
new PeriodicWorkRequest.Builder(MyWorker.class, 15, TimeUnit.MINUTES)
// Sets the input data for the ListenableWorker
.setConstraints(constraints)
.build();
当有连接时,每15分钟(最小间隔)执行一次worker。你必须考虑的另一个限制是,工人不能运行超过10分钟。在此间隔之后,操作系统将停止您的工作进程
这两个限制都来自Android框架中的底层JobScheduler API。Hi@Waxren当互联网接入时,无论使用Android JobScheduler还是Android workmanager,您是否只想触发一个侦听器?是的,但即使应用程序关闭且未运行Hi@Waxren,您是否只想在互联网接入时触发一个侦听器是否使用android jobscheduler或android workmanager?是的,但即使在应用程序关闭且未运行workmanager时,也包含仅当设备连接到网络时才可用于运行worker的约束。您的方法在电池上更具攻击性,并且没有考虑工作人员的10分钟执行限制。工作进程在10分钟后会被操作系统自动停止。我对使用非常过时的WorkManager版本和使用糟糕的网络检查实现投了反对票(提示:您应该使用约束,不要使用ConnectionManager)@pfmaggi FYI最小重复时间为15分钟,而不是10分钟是的,最小重复时间为15分钟。然而,我在这里写的10分钟是一个工作者的最长执行时间:如果你的工作者运行超过10分钟,操作系统将停止它。请阅读更多关于work manager的内容,并使用它来确保它的实际工作情况。。。据我所知,工人不停地跑10分钟是没有意义的。。Work Manager可能无法在DOZE模式下工作Work Manager包含仅当设备连接到网络时才可用于运行worker的约束。您的方法在电池上更具攻击性,并且没有考虑工作人员的10分钟执行限制。工作进程在10分钟后会被操作系统自动停止。我对使用非常过时的WorkManager版本和使用糟糕的网络检查实现投了反对票(提示:您应该使用约束,不要使用ConnectionManager)@pfmaggi FYI最小重复时间为15分钟,而不是10分钟是的,最小重复时间为15分钟。然而,我在这里写的10分钟是一个工作者的最长执行时间:如果你的工作者运行超过10分钟,操作系统将停止它。请阅读更多关于work manager的内容,并使用它来确保它的实际工作情况。。。据我所知,工人不停地跑10分钟是没有意义的。。工作经理可能无法在打盹模式下工作考虑以下示例用户打开Wi-Fi作业将在之后和15分钟间隔结束之前执行用户关闭Wi-Fi作业将不执行这是问题我需要一个定期作业,但不是定期作业,换句话说,作业应在设备一次连接到网络后运行,下一次不是在15分钟(或任何特定间隔)后运行,而是在设备再次连接后运行。工作进程将仅在上一次执行15分钟后执行。如果您需要在连接可用时立即执行它,考虑到API 26+上隐含的广播限制,我建议您使用带有侦听器的前台服务进行连接。感谢您的评论。我认为这是库中缺少的功能,而不是使用前台服务。因为许多应用程序需要在连接可用时立即运行作业代码。我担心库无法添加此支持,因为它只是使用系统(JobScheduler)中已经可用的内容,并使用它