Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

Service использует много памяти - Программирование Android

Войти
Регистрация
Восстановить пароль
Другие темы раздела
Программирование Android Запуск Activity из другого apk http://www.cyberforum.ru/android-dev/thread1783510.html
Здравствуйте! Попытаюсь максимально собрать мысли в кучу и описать, то что мне надо. Есть скомпилированный apk файл без исходного кода, этот apk подключается в моем проекте с помощью DexClassLoader,...
Программирование Android Заблокировать долгое нажатие на кнопку HOME Здравствуйте! Как заблокировать долгое нажатие на кнопку HOME в своем приложении? P.S. Android 4.2.2 На версиях 5.0+ меню недавних приложений "блокирую" так: @Override protected void... http://www.cyberforum.ru/android-dev/thread1783430.html
Получить текст с нажатой кнопки Программирование Android
Здравствуйте. Начал изучать Android Studio и в рамках своего обучения пытаюсь сделать простой калькулятор. Дабы не плодить код сделал один обработчик нажатия кнопок: View.OnClickListener...
Разные цвета для звезд для RatingBar Программирование Android
Подскажите пожалуйста, существуют ли способы окрашивания каждой следующей звезды в новый цвет? Базовыми средствами андроид можно задать только один Drawable для всех звезд, и они будут им...
Программирование Android Когда пересчитывается backstack ? http://www.cyberforum.ru/android-dev/thread1783291.html
Расскажите товарищи опытные.... Имеется автивити с кучей фрагментов. пользователь может перемещаться от одного в другой, все перемещения кладутся в стек. Идея какая - нужно "морфировать"...
Программирование Android Время и Дата Добрый день! У меня возникла проблема,я парсю дату публикации новости в формате ISO(на сколько я понимаю)"2016-01-22T05:55:55Z".Мне нужно вывести эту дату в "нормальном виде".Я пытался использовать... подробнее

Показать сообщение отдельно
schlawiner
8 / 8 / 4
Регистрация: 25.05.2014
Сообщений: 29
Завершенные тесты: 1

Service использует много памяти - Программирование Android

21.07.2016, 07:07. Просмотров 215. Ответов 2
Метки (Все метки)

Всем привет! у меня есть сервис (IntentService), который работает в отдельном процессе. Суть этого сервиса синхронизировать данные с сервера в локальную БД, это более тысячи запросов к серверу и сохранение результата в бд. Сервис работает замечательно, только есть проблема в потреблении памяти. Она может постепенно вырасти до 50МБ, потом сбросить 10-20МБ, потом опять растет и немного сбрасывает. у меня доходило до 100МБ. Когда сервис завершает работу, память вся сбрасывается и процесс успешно закрывается. Почему так происходит я не понимаю. утечка памяти или специфическая работа сборщика мусора.

Теперь перейдем непосредственно к коду. Первое - это главный метод в сервисе, который выполняет все работу:

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
int currentPage = 1;
        SynchronizeThreadPoolExecutor threadPoolExecutor = new SynchronizeThreadPoolExecutor(NUMBER_OF_CORES/2,
                NUMBER_OF_CORES/2,
                KEEP_ALIVE_TIME,
                KEEP_ALIVE_TIME_UNIT,
                synchBlockingQueue);
        while (true) {
            if (pageCount >= currentPage) {
                if (threadPoolExecutor.getActiveCount() < threadPoolExecutor.getMaximumPoolSize()) {
                    threadPoolExecutor.execute(new SynchronizeRunnable(currentPage,
                            new Date(timeSynchronize.getDateAndTimeLastSynchronize().getTime())));
                    currentPage++;
                }
            } else {
                break;
            }
        }
        setDateLastSynchronize(timeSynchronize);
        RealmConfiguration configuration = realm.getConfiguration();
        realm.close();
        realm = null;
        Realm.compactRealm(configuration);
Здесь создается экземпляр ThreadPoolExecutor(в данном случае моя реализация данного класса), который контролирует количество одновременно выполняемых задач. такой цикл наверное не лучшая реализация, но лучше я не придумал

Собственно сам класс SynchronizeThreadPoolExecutor
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class SynchronizeThreadPoolExecutor extends ThreadPoolExecutor {
 
 
    public SynchronizeThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime,
                                         TimeUnit unit, BlockingQueue<Runnable> workQueue) {
        super(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue);
    }
 
    @Override
    protected void afterExecute(Runnable r, Throwable t) {
        super.afterExecute(r, t);
        remove(r);
    }
}
Здесь особо ничего интересного, просто удаляю завершенный поток из пула.

Ну и реализация Runnable, где происходит запрос и запись(для запросов использую retrofit, для бд - realm)
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
public class SynchronizeRunnable implements Runnable {
 
 
    HashMap<String, String> searchParam;
 
 
    public SynchronizeRunnable(int page, Date dateSynch) {
        searchParam = new HashMap<>();
        searchParam.put("modified", new SimpleDateFormat("yyyy-MM-dd")
                .format(dateSynch));
        searchParam.put("page", String.valueOf(page));
    }
 
 
    @Override
    public void run() {
 
        try {
            Response response = RetrofitRequest.getNotariesRequest(searchParam);
            List<Notary> notaries = response.getResults();
            Realm realm = Realm.getDefaultInstance();
            realm.beginTransaction();
            realm.copyToRealmOrUpdate(notaries);
            realm.commitTransaction();
            RealmConfiguration configuration = realm.getConfiguration();
            realm.close();
            realm = null;
            Realm.compactRealm(configuration);
 
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
Из запроса получаю список объектов которые записываю в БД.

Класс для запроса на сервер:
Java
1
2
3
4
5
6
7
8
9
10
11
12
public class RetrofitRequest {
 
    private static Retrofit retrofit = RetrofitAdapter.getRetrofit();
 
    private static NotaryApi notaryApi =  retrofit.create(NotaryApi.class);
 
    public static Response getNotariesRequest(HashMap<String, String> searchParam) throws IOException {
        Call<Response> call;
        call = notaryApi.getNotaries(searchParam);
        return call.execute().body();
    }
}
Вот такие пироги. Если кто сталкивался с подобным или видит ошибки в реализации сервиса прошу подсказать
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru