Итак, я сделал приложение, которое использует много потоков/Runnable (мы говорим о 300+) для загрузки большого количества контента. Это отлично работает на эмуляторе и некоторых устройствах, таких как Samsung Galaxy S3, но по какой-то причине на HTC One и других устройствах мои потоки или службы останавливаются без какого-либо уведомления, предупреждения или ошибки. Приложение продолжает работать, но любой сервис/поток, который запускает все потоки, просто завершается.
Что я пробовал:
- Использование ExecutorService (пул потоков) для запуска и управления всеми потоками
- Запускать потоки в AsyncTask с помощью ExecutorService
- Запускать потоки в связанной службе с помощью ExecutorService
- Запустить потоки в службе START_STICKY и startForeground
Logcat от HTC One с START_STICKY и startForeground (только что сохранил данные под названием POI, начиная загрузку с номера 26, затем останавливая):
05-23 14:52:54.732: D/libc(17514): [NET] getaddrinfo+,hn 13(0x6170692e706172),sn(),family 0,flags 4
05-23 14:52:54.732: D/libc(17514): [NET] getaddrinfo-,err=8
05-23 14:52:55.363: D/historie(17514): save POI id: jtyvZD9bX9
05-23 14:52:55.383: D/historie(17514): Starting poi number: 26
05-23 14:52:57.595: D/WifiStateMachine(705): fetchRssiAndLinkSpeedNative RSSI = -65 abnormalRssiCnt = 0 newLinkSpeed = 72
05-23 14:52:57.595: D/WifiStateMachine(705): fetchRssiAndLinkSpeedNative mLinkspeedCount = 1, mLinkspeedSum: 72
05-23 14:52:59.998: D/PMS(705): acquireWL(4237bc08): PARTIAL_WAKE_LOCK AlarmManager 0x1 705 1000
05-23 14:53:00.028: D/PMS(705): releaseWL(4237bc08): PARTIAL_WAKE_LOCK AlarmManager 0x1
05-23 14:53:00.048: I/ClockThread(996): now=1400849580059 next=59941
05-23 14:53:00.068: W/MastheadClock(1546): mDigitAnimMin.start
05-23 14:53:00.608: D/WifiStateMachine(705): fetchRssiAndLinkSpeedNative RSSI = -65 abnormalRssiCnt = 0 newLinkSpeed = 72
05-23 14:53:00.608: D/WifiStateMachine(705): fetchRssiAndLinkSpeedNative mLinkspeedCount = 2, mLinkspeedSum: 144
05-23 14:53:03.642: D/WifiStateMachine(705): fetchRssiAndLinkSpeedNative RSSI = -65 abnormalRssiCnt = 0 newLinkSpeed = 72
05-23 14:53:03.642: D/WifiStateMachine(705): fetchRssiAndLinkSpeedNative mLinkspeedCount = 3, mLinkspeedSum: 216
05-23 14:53:06.675: D/WifiStateMachine(705): fetchRssiAndLinkSpeedNative RSSI = -64 abnormalRssiCnt = 0 newLinkSpeed = 72
05-23 14:53:06.675: D/WifiStateMachine(705): fetchRssiAndLinkSpeedNative mLinkspeedCount = 4, mLinkspeedSum: 288
05-23 14:53:09.698: D/WifiStateMachine(705): fetchRssiAndLinkSpeedNative RSSI = -64 abnormalRssiCnt = 0 newLinkSpeed = 72
05-23 14:53:09.698: D/WifiStateMachine(705): fetchRssiAndLinkSpeedNative mLinkspeedCount = 5, mLinkspeedSum: 360
05-23 14:53:09.698: D/WifiStateMachine(705): fetchRssiAndLinkSpeedNative: Update RSSI:-64 and linkspeed:72 in database
05-23 14:53:09.698: D/WifiApDatabaseHandler(705): updateConnectedAP...
Изменить 1:
Таким образом, вызов GC вручную позволяет мне загружать больше данных, после чего он снова останавливается, поэтому я могу взломать его, вызывая GC каждый раз, когда я загружаю новые данные. Это моя текущая реализация, но почему готовые потоки занимают память? Есть ли лучший способ сделать это?