Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/222.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 每次internet可用时运行worker_Java_Android_Android Jobscheduler_Android Workmanager_Jobservice - Fatal编程技术网

Java 每次internet可用时运行worker

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库一

我正在开发一个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)中已经可用的内容,并使用它