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

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

Восстановить пароль Регистрация
Другие темы раздела
Android Запуск Activity из другого apk http://www.cyberforum.ru/android-dev/thread1783510.html
Здравствуйте! Попытаюсь максимально собрать мысли в кучу и описать, то что мне надо. Есть скомпилированный apk файл без исходного кода, этот apk подключается в моем проекте с помощью DexClassLoader, далее с помощью reflection я оттуда тяну нужные классы и работаю с ними. Все было хорошо пока мне не понадобилось запустить activity этого apk. При попытке сделать это "влоб", естественно android...
Android Заблокировать долгое нажатие на кнопку HOME Здравствуйте! Как заблокировать долгое нажатие на кнопку HOME в своем приложении? P.S. Android 4.2.2 На версиях 5.0+ меню недавних приложений "блокирую" так: @Override protected void onUserLeaveHint() { Toast toast = Toast.makeText(getApplicationContext(), "Home: OK", Toast.LENGTH_SHORT); toast.show(); startActivity(new Intent(LockscreenMain.this, LockscreenMain.class));... http://www.cyberforum.ru/android-dev/thread1783430.html
Получить текст с нажатой кнопки Android
Здравствуйте. Начал изучать Android Studio и в рамках своего обучения пытаюсь сделать простой калькулятор. Дабы не плодить код сделал один обработчик нажатия кнопок: View.OnClickListener onClickListener = new View.OnClickListener(){ @Override public void onClick(View view) { switch (view.getId()){ case R.id.btnC: ...
Разные цвета для звезд для RatingBar Android
Подскажите пожалуйста, существуют ли способы окрашивания каждой следующей звезды в новый цвет? Базовыми средствами андроид можно задать только один Drawable для всех звезд, и они будут им закрашиваться. А мне нужно, чтобы каждая звезда имела свой Drawable. Есть ли какие нибудь библиотеки или мне руками имитировать свой ratingBar? А это долговато. Спасибо заранее
Android Когда пересчитывается backstack ? http://www.cyberforum.ru/android-dev/thread1783291.html
Расскажите товарищи опытные.... Имеется автивити с кучей фрагментов. пользователь может перемещаться от одного в другой, все перемещения кладутся в стек. Идея какая - нужно "морфировать" "гамбургер" в стрелочку назад и обратно в зависимости от состояния стека. Тоюишь на первом фрагменте - гамбургей на всех остальных стрелки "назад". Сейчас получается что при переходе с 1 на 2й фрагмент...
Android Время и Дата Добрый день! У меня возникла проблема,я парсю дату публикации новости в формате ISO(на сколько я понимаю)"2016-01-22T05:55:55Z".Мне нужно вывести эту дату в "нормальном виде".Я пытался использовать этот код,но не понимаю куда нужно вставить полученную дату,чтобы её преобразовать. TimeZone timezone = TimeZone.getTimeZone("UTC"); DateFormat dateFormat = new... подробнее

Показать сообщение отдельно
schlawiner
5 / 5 / 2
Регистрация: 25.05.2014
Сообщений: 21
Завершенные тесты: 1
21.07.2016, 07:07     Service использует много памяти
Всем привет! у меня есть сервис (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();
    }
}
Вот такие пироги. Если кто сталкивался с подобным или видит ошибки в реализации сервиса прошу подсказать
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
Текущее время: 01:56. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru