Adm*_*kka 6 android android-workmanager
我使用了 WorkManager 版本android.arch.work:work-runtime:1.0.0-beta03。我使用这个 workmanager 使用 OneTimeWorker 以动态间隔时间将文件上传到服务器。
这就是我所做的。希望你能检查一下并告诉我我错在哪里以及解决它的替代方法。
首先,我提出工作要求
OneTimeWorkRequest workRequest = new OneTimeWorkRequest.Builder(MyWorkRequest.class)
.setInitialDelay(0), TimeUnit.SECONDS)
.addTag("UploadData")
.build();
WorkManager
.getInstance()
.getWorkInfoByIdLiveData(workRequest.getId())
.observeForever(workInfoObserverBackground);
WorkManager
.getInstance()
.enqueueUniqueWork("UploadData", ExistingWorkPolicy.REPLACE, workRequest);
Run Code Online (Sandbox Code Playgroud)
然后,定义观察者以听取其结果。我也从这里开始下一次运行。
workInfoObserverBackground = workInfo -> {
if (workInfo != null){
switch (workInfo.getState()) {
case SUCCEEDED:
case FAILURE:
WorkManager.getInstance().getWorkInfoByIdLiveData(workRequest.getId()).removeObserver(workInfoObserverBackground);
WorkManager.getInstance().cancelUniqueWork("UploadData");
WorkManager.getInstance().cancelAllWorkByTag("UploadData");
workRequest = new OneTimeWorkRequest.Builder(MyWorkRequest.class)
.setInitialDelay(next_interval_time_received_from_api), TimeUnit.SECONDS)
.addTag("UploadData")
.build();
WorkManager
.getInstance()
.getWorkInfoByIdLiveData(workRequest.getId())
.observeForever(workInfoObserverBackground);
WorkManager
.getInstance()
.enqueueUniqueWork("UploadData", ExistingWorkPolicy.REPLACE, workRequest);
break;
}
}
};
Run Code Online (Sandbox Code Playgroud)
几分钟后(我无法记录它,因为它是随机发生的)它崩溃了,这是从 logcat 收集的堆栈跟踪。
1-15 21:46:14.806 25964-26054/com.example.app E/AndroidRuntime: FATAL EXCEPTION: pool-8-thread-1
Process: com.example.app, PID: 25964
android.database.CursorWindowAllocationException: Cursor window allocation of 2048 kb failed.
at android.database.CursorWindow.<init>(CursorWindow.java:108)
at android.database.AbstractWindowedCursor.clearOrCreateWindow(AbstractWindowedCursor.java:198)
at android.database.sqlite.SQLiteCursor.fillWindow(SQLiteCursor.java:139)
at android.database.sqlite.SQLiteCursor.getCount(SQLiteCursor.java:133)
at androidx.work.impl.model.WorkSpecDao_Impl.getInputsFromPrerequisites(WorkSpecDao_Impl.java:1112)
at androidx.work.impl.WorkerWrapper.runWorker(WorkerWrapper.java:171)
at androidx.work.impl.WorkerWrapper.run(WorkerWrapper.java:124)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
at java.lang.Thread.run(Thread.java:818)
Run Code Online (Sandbox Code Playgroud)
我的间隔时间总是 1 秒。也许旧任务与下一个任务挂起并且无法销毁?
| 归档时间: |
|
| 查看次数: |
279 次 |
| 最近记录: |