IntentService被系统杀死

时间:2017-11-30 13:53:00

标签: android sqlite intentservice

我有一个应用程序,我可以在服务器上提交时间状态。 为节省电量,我将状态项排在SQLite Database之后,并定期向JobScheduler提交IntentService服务器。

插入项目的功能如下所示:

 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());期间被系统导致内存不足而被杀死,它有时会成功提交给服务器,但它不会被删除队列。

所以下次队列启动时会再次提交。

我该如何解决这个问题?

1 个答案:

答案 0 :(得分:0)

嗯,在这种情况下,你可以做两件事之一

  1. 在插入后的服务中,将插入记录保存在本地(在本地数据库中)作为布尔标志。这将让您确信您的记录已成功提交。
  2. 第二种方式是,当您在服务器数据库上点击服务时,在插入记录之前检查该记录是否已存在。我可以看到你正在发送物品。应该有某种项目ID。检查服务器数据库是否存在针对项目ID的记录,如果是,则保留该记录。 这应该可以解决问题。