【发布时间】:2017-11-30 13:53:00
【问题描述】:
我有一个应用程序,我可以在其中向服务器提交时间状态。
为了节省电池电量,我将状态项放入 SQLite Database 中排队,并定期将它们与启动 IntentService 的 JobScheduler 一起提交给服务器。
插入项目的函数如下所示:
public synchronized void workThroughQueue() {
try {
for (QueueItem queueItem : getAllQueueItems()) {
try {
dao.insert(queueItem.getItem());
delete(queueItem);
} catch (Exception e) {
Log.e(TAG, "Queueitem konnte nicht verarbeitet werden: " + e.getMessage(), e);
}
}
} catch (Exception e) {
Log.e(TAG, "Queueverarbeitung nicht vollständig: " + e.getMessage(), e);
}
}
服务(kotlin):
class QueueService : IntentService(QueueService::class.java.name) {
override fun onHandleIntent(intent: Intent?) {
Log.d("QueueService", "Jobservice started")
TimerecordQueue().workThroughQueue()
DangerAllowanceQueue().workThroughQueue()
ProjektEndQueue().workThroughQueue()
PhotoUploadQueue().workThroughQueue()
}
}
我的问题是,如果进程在dao.insert(queueItem.getItem()); 期间被系统内存不足的原因杀死,它有时会成功提交到服务器,但不会从队列中删除。
所以下次队列启动时它会再次提交。
我该如何解决这个问题?
【问题讨论】:
-
什么是 dao.insert() 是那个 web 服务调用?
-
是的,https请求到服务器
-
"用一个启动 IntentService 到服务器的 JobScheduler 定期提交它们" -- 你为什么不让你的
JobService来做这个工作?毕竟,您的方法不适用于 Android 8.0+,除非您将IntentService设置为前台服务,或者除非您非常确定onHandleIntent()将在不到一分钟的时间内完成。在您的JobService中包含此代码不仅可以让您在工作完成时告诉JobScheduler,还可以为您提供更长的时间(约 10 分钟)来完成工作并解决 Android 8.0 后台服务限制. -
我在某处读到作业服务在主线程中运行,而在主线程中无法进行 Web 请求?
标签: android sqlite intentservice