首页 > 解决方案 > 如何使用 PeriodicWorkRequest 修复 Android WorkManager 中的“E/WM-SystemJobScheduler:无法调度”错误?

问题描述

我正在尝试使用 Android x Library 在 Android 中使用 Work Manager 设置 PeriodicWorkRequest。但每次我得到以下异常。

E/WM-SystemJobScheduler: 无法安排 {WorkSpec: 8fc2b535-4869-438b-b44e-54e1b4b3507c} java.lang.IllegalArgumentException: 没有这样的服务 ComponentInfo{in.dharmalife.dlone/androidx.work.impl.background.systemjob.SystemJobService在 android.os.Parcel.readException(Parcel.java:1884) 在 android.app 在 android.os.Parcel.readException(Parcel.java:1934) 在 android.os.Parcel.createException(Parcel.java:1970) .job.IJobScheduler$Stub$Proxy.schedule(IJobScheduler.java:184) 在 android.app.JobSchedulerImpl.schedule(JobSchedulerImpl.java:44) 在 androidx.work.impl.background.systemjob.SystemJobScheduler.scheduleInternal(SystemJobScheduler.java :182) 在 androidx.work.impl 的 androidx.work.impl.background.systemjob.SystemJobScheduler.schedule(SystemJobScheduler.java:128)。Schedulers.schedule(Schedulers.java:92) 在 androidx.work.impl.utils.EnqueueRunnable.scheduleWorkInBackground(EnqueueRunnable.java:132) 在 androidx.work.impl.utils.EnqueueRunnable.run(EnqueueRunnable.java:93) 在 androidx .work.impl.utils.SerialExecutor$Task.run(SerialExecutor.java:91) 在 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167) 在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor .java:641) 在 java.lang.Thread.run(Thread.java:764)91) 在 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167) 在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641) 在 java.lang.Thread.run(Thread.java :764)91) 在 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167) 在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641) 在 java.lang.Thread.run(Thread.java :764)

我做了以下事情:

  1. 添加 gradle 依赖。
  2. 创建了 Constraint 和 PeriodicWorkRequest 对象,并使用工作管理器将请求排入队列。

    public static void storeAttendanceData(Context context, @NotNull AttendanceModel attendanceModel) {
    
    Constraints myConstraints = new Constraints.Builder()
            .setRequiredNetworkType(NetworkType.CONNECTED)
            .build();
    PeriodicWorkRequest workRequest = new PeriodicWorkRequest.Builder(AttendanceWorker.class, 1, TimeUnit.HOURS)
            .setConstraints(myConstraints)
            .build();
    WorkManager.getInstance(context).enqueueUniquePeriodicWork("Attendance Worker", ExistingPeriodicWorkPolicy.REPLACE, workRequest);
    }
    
    
    
     public class AttendanceWorker extends Worker {
           SessionManager sessionManager;
    
     public AttendanceWorker(@NonNull Context context, @NonNull WorkerParameters workerParams) {
       super(context, workerParams);
       sessionManager = new SessionManager(context);
     }
    
     @NonNull
     @Override
     public Result doWork() {
        makeAttendanceRequest();
        return Result.success();
     }
    
     private void makeAttendanceRequest() {
        final AttendanceDao attendanceDao = 
        AppDatabase.getDatabase(getApplicationContext()).getAttendanceDao();
    
        if (attendanceDao.getAllAttendance() != null && attendanceDao.getAllAttendance().length > 0) {
        final String attendanceData = new Gson().toJson(attendanceDao.getAllAttendance());
    
        Log.e("Complete Attendance ", attendanceData);
    
        JsonObjectRequest request = new JsonObjectRequest(Request.Method.POST, Urls.UPLOAD_ATTENDANCE, attendanceData, new Response.Listener<JSONObject>() {
            @Override
            public void onResponse(JSONObject response) {
    
                Log.e("Attendance Worker -- > ", response.toString());
                Type type = new TypeToken<List<AttendanceModel>>() {
                }.getType();
                ArrayList<AttendanceModel> apiLogsList = new Gson().fromJson(attendanceData, type);
                attendanceDao.deleteAllLogs(apiLogsList);
    
                Log.e("After Delete Worker--> ", new Gson().toJson(attendanceDao.getAllAttendance()));
            }
        }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                error.printStackTrace();
            }
        }) {
            @Override
            public Map<String, String> getHeaders() throws AuthFailureError {
                Map<String, String> headers = new HashMap<>();
                headers.put("Authorization", "JWT " + sessionManager.getSessionToken());
                headers.put("lang", sessionManager.getLanguageId() + "");
                headers.put("language", sessionManager.getSelectedLanguage());
                headers.put("ipAddress", Utils.getLocalIpAddress());
                Log.e("Attendance Headers ", headers.toString());
                return headers;
            }
        };
    
        request.setRetryPolicy(new DefaultRetryPolicy(30000, 0, 0));
        AppController.getInstance().addToRequestQueue(request);
    }
    
    }
    }
    

我希望该请求应该可以工作,但它会作为异常抛出

E/WM-SystemJobScheduler: 无法安排 {WorkSpec: 8fc2b535-4869-438b-b44e-54e1b4b3507c} java.lang.IllegalArgumentException: 没有这样的服务 ComponentInfo{in.dharmalife.dlone/androidx.work.impl.background.systemjob.SystemJobService在 android.os.Parcel.readException(Parcel.java:1884) 在 android.app 在 android.os.Parcel.readException(Parcel.java:1934) 在 android.os.Parcel.createException(Parcel.java:1970) .job.IJobScheduler$Stub$Proxy.schedule(IJobScheduler.java:184) 在 android.app.JobSchedulerImpl.schedule(JobSchedulerImpl.java:44) 在 androidx.work.impl.background.systemjob.SystemJobScheduler.scheduleInternal(SystemJobScheduler.java :182) 在 androidx.work.impl 的 androidx.work.impl.background.systemjob.SystemJobScheduler.schedule(SystemJobScheduler.java:128)。Schedulers.schedule(Schedulers.java:92) 在 androidx.work.impl.utils.EnqueueRunnable.scheduleWorkInBackground(EnqueueRunnable.java:132) 在 androidx.work.impl.utils.EnqueueRunnable.run(EnqueueRunnable.java:93) 在 androidx .work.impl.utils.SerialExecutor$Task.run(SerialExecutor.java:91) 在 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167) 在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor .java:641) 在 java.lang.Thread.run(Thread.java:764)91) 在 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167) 在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641) 在 java.lang.Thread.run(Thread.java :764)91) 在 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167) 在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641) 在 java.lang.Thread.run(Thread.java :764)

标签: androidandroidxandroid-workmanagerperiodic-task

解决方案


推荐阅读