2

Syncing ich große app bin zu entwickeln, die alle X Minuten (für Tests sagen 5 Minuten) wird durch AlarmManger Aufruf:Seltsam hinkt während app

mAlarmManager.setAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, nextSyncTime.getMillis(), PendingIntent.getBroadcast(this, INTERVAL_SYNC_SERVICE_REQ_CODE, new Intent(SYNC_ACTION), PendingIntent.FLAG_UPDATE_CURRENT)); 

Klasse ScheduledRecevier für SYNC_ACTION hört und IntentService starten. Während dieses Dienstes werden mehrere (ca. 25) APIs mit Retrofit2 zum selben Server aufgerufen. Einer nach dem anderen - wenn man mit dem Herunterladen und Schreiben in Datebase fertig ist, wird ein anderer gestartet. Und so weiter.

Mein Problem ist, dass, während ich nicht Gerät verwende diesen Prozess verschiedene Zeiten dauern. Ich meine: die meisten, wenn die Zeit es ist ca. 2 Minuten, max 3, aber manchmal (8-16 mal pro Tag) es etwa 10 Minuten dauern: O

Hier ist log:

11:23:09.064 8388-8388/myApp V/ScheduledReceiver: Sync from alarm 
11:23:09.154 8388-9007/myApp V/SynchronizationService: Sync started 
11:23:10.474 8388-9007/myApp V/Sync1: Sync completed 
11:23:10.604 8388-9007/myApp V/Sync2: Sync completed 
11:23:10.724 8388-9007/myApp V/Sync3: Sync completed 
11:23:11.555 8388-9007/myApp V/Sync4: Sync completed 
11:23:11.766 8388-9007/myApp V/Sync5: Sync completed 
11:24:18.248 8388-9007/myApp V/Sync6: Sync completed 
11:24:18.496 8388-9007/myApp V/Sync7: Sync completed 
11:25:19.813 8388-8399/myApp I/art: Background sticky concurrent mark sweep GC freed 127447(6MB) AllocSpace objects, 3(204KB) LOS objects, 37% free, 11MB/19MB, paused 1.257ms total 104.434ms 
11:26:27.355 8388-9007/myApp V/Sync8: Sync completed 
11:31:20.562 8388-8388/myApp I/Timeline: Timeline: Activity_idle id: [email protected] time:67843774 
11:31:22.592 8388-8388/myApp I/Timeline: Timeline: Activity_launch_request id:com.santander.msantander time:67845808 
11:31:22.722 8388-8388/myApp D/SecWifiDisplayUtil: Metadata value : SecSettings2 
11:31:22.852 8388-8388/myApp I/Timeline: Timeline: Activity_idle id: [email protected] time:67846063 
11:31:24.642 8388-8388/myApp I/Timeline: Timeline: Activity_idle id: [email protected] time:67847852 
11:31:30.302 8388-9007/myApp V/Sync9: noUpdate 
11:31:30.472 8388-8399/myApp I/art: Background sticky concurrent mark sweep GC freed 245773(8MB) AllocSpace objects, 0(0B) LOS objects, 29% free, 20MB/28MB, paused 1.481ms total 156.454ms 
11:31:30.982 8388-9007/myApp V/Sync10: Sync completed 

BEGIN_DATE 
2017-02-24 11:23:07.617 
END_DATE 
2017-02-24 11:31:32.303 

11:36:35.162 8388-8388 /myApp V/ScheduledReceiver: Sync from alarm 
11:36:35.172 8388-13586/myApp V/SynchronizationService: Sync started 
11:36:37.202 8388-13586/myApp V/Sync1: Sync completed 
11:36:37.392 8388-13586/myApp V/Sync2: Sync completed 
11:36:37.572 8388-13586/myApp V/Sync3: Sync completed 
11:36:38.232 8388-13586/myApp V/Sync4: Sync completed 
11:36:38.482 8388-13586/myApp V/Sync5: Sync completed 
11:36:39.812 8388-13586/myApp V/Sync6: Sync completed 
11:36:40.072 8388-13586/myApp V/Sync7: Sync completed 
11:36:40.632 8388-13586/myApp V/Sync8: Sync completed 
11:36:49.432 8388-8399/ myApp I/art: Background sticky concurrent mark sweep GC freed 266493(10MB) AllocSpace objects, 1(68KB) LOS objects, 40% free, 15MB/26MB, paused 1.661ms total 125.890ms 
11:36:54.392 8388-8399/ myApp I/art: Background partial concurrent mark sweep GC freed 301387(10MB) AllocSpace objects, 1(68KB) LOS objects, 50% free, 15MB/31MB, paused 1.572ms total 145.270ms 
11:36:56.992 8388-13586/myApp V/Sync9: noUpdate 
11:36:57.172 8388-13586/myApp V/Sync10: Sync completed 


BEGIN_DATE 
2017-02-24 11:36:34.180 
END_DATE 
2017-02-24 11:37:00.540 

Zur Vereinfachung Ich rief clipped an APIs SyncX an, um zu zeigen, dass dies in beiden Fällen der gleiche Pfad ist. Ich habe den Rest der Synchronisierung ausgelassen und eingefügt, was in datebase als Synchronisierungsstartzeit und Endzeit protokolliert wurde.

Wie Sie im ersten Fall um 11:23 Uhr sehen können, begann die Synchronisierung von Alarm und endete um 11:31 Uhr. Im zweiten Fall hat es um 11:36 begonnen und endete um 11:37 Uhr

In beiden Fällen gab es den gleichen Teil der Daten. Alle Synchronisierungen haben einen ähnlichen Prozess: Tabelle löschen, Tabelle erstellen, neue Daten einfügen (Sammlungslöschung funktioniert nicht in einem so großen Teil der auszutauschenden Daten). Sync7, Sync8, Sync9 unterscheiden sich dabei nicht.

Jeder hat eine Idee, wie man das verbessert, um kurze Zeiten zu haben? Alle Anrufe sind mit Login und Passwort aus der lokalen Datenbank und müssen direkt von der App aus angerufen werden, um den Server zu erreichen (sicherer Arbeitsbereich).

Antwort

1

Studieren Sie Doze and Standby, um das Verhalten Ihrer App zu verstehen. Ich weiß, dass Sie mAlarmManager.setAndAllowWhileIdle() verwenden, die den Alarm auslöst, selbst wenn sich das Gerät im Schlaf- oder Standby-Modus befindet. Es löst nur den Alarm und Ihre onReceive() und Sie starten Ihren Dienst in dieser Funktion aufgerufen werden, die die Daten-Synchronisierung ABER

App ist noch im Doze oder Standby-Modus

die Griffe Wach Telefonieren Sie in Ihrem onReceive() in der Art, wie es bleiben soll, während Ihr Dienst sich synchronisiert.

Ich hoffe, es macht Sinn. Danke!

+0

Danke, ich werde das versuchen :) Danke für den Tipp :) – masztalski

+0

Viel Glück. :) Hoffentlich finden Sie bald eine Lösung. :) –