android - 如何使用 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)
我做了以下事情:
- 添加 gradle 依赖。
创建了 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)
解决方案
推荐阅读
- linux - 如何在bash中用冒号读取文本文件
- sql - 交换两列而不更新
- reverse-proxy - 前端的 HAProxy ACL 发送到不同的后端
- php - Symfony 3 - 不能从静态函数使用 $this->renderView()
- reactjs - 令牌应保存在前端的位置(reactjs)
- vhdl - JK 4-bit up counter - reset on 1010 not working
- testing - extentreports-testng-adapter : 如果测试失败,如何生成带有屏幕截图的 HTML 报告(黄瓜,testng)
- python - 数据帧循环内的 if/else 语句
- delphi - 编码后WebSocket握手哈希错误
- c++ - boost::asio 允许在连接处理程序阻塞时非阻塞接受新连接