С Новым годом! Форум программистов, компьютерный форум, киберфорум
Программирование Android
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.55/11: Рейтинг темы: голосов - 11, средняя оценка - 4.55
2 / 2 / 0
Регистрация: 16.08.2013
Сообщений: 86

Утечка памяти при использовании Handler

10.10.2014, 14:48. Показов 2342. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день, многоуважаемые форумчане .
Прошу помощи в решении проблемы.

Приведу несложный исходный код.

MainActivity.java
Кликните здесь для просмотра всего текста
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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
import android.app.Activity;
import android.media.AudioManager;
import android.media.SoundPool;
import android.os.Bundle;
import android.os.CountDownTimer;
import android.os.Handler;
import android.widget.TextView;
 
public class MainActivity extends Activity
{
    TextView textView;
    SoundPool sp;
    int soundID_btn1;
    TimerX timer;
    
    public class TimerX extends CountDownTimer
    {
        public TimerX(long millisInFuture, long countDownInterval)
        {   super(millisInFuture, countDownInterval);
        }
 
        @Override public void onTick(long millisUntilFinished)
        {   textView.setText(Integer.toString((int)millisUntilFinished));
        }
        
        // Вызывается, когда таймер закончил обратный отсчёт
        @Override public void onFinish()
        {   textView.setText("0000");
            method();
        }
    }
    
    @Override protected void onCreate(Bundle savedInstanceState)
    {   super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
 
        textView = (TextView) findViewById(R.id.textView);
        sp = new SoundPool(5, AudioManager.STREAM_MUSIC, 0);
        soundID_btn1 = sp.load(this, R.raw.drip4, 1);
    }
    
    @Override protected void onResume()
    {   super.onResume();
        timer = new TimerX(4010, 1000);                 // создаём таймер с начальным временем 4010мсек, который уменьшается каждые 1000мсек на 1000мсек
        timer.start();                                  // запускает таймер
    }
    
    void method()
    {   Handler handler = new Handler();
        handler.postDelayed(new Runnable()
        {   public void run()
            {   sp.play(soundID_btn1, 1, 1, 0, 0, 1);   // воспроизводит звуковой файл, чтобы услышать утечку памяти
                timer.cancel();                         // останавливает старый таймер
                timer = new TimerX(4010, 1000);         // создаёт новый таймер
                timer.start();                          // запускает новый таймер
            }
        }, 5000);
    }
 
    @Override protected void onPause()
    {   super.onPause();
        timer.cancel();                                 // останавливает таймер
    };
}

main.xml
Кликните здесь для просмотра всего текста
XML
1
2
3
4
5
6
7
8
9
10
11
12
13
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:gravity="center"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >
    
    <TextView
        android:id="@+id/textView"
        android:text="TextView"
        android:textSize="20pt"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />
 
</LinearLayout>

Звуковой файл:
Кликните здесь для просмотра всего текста

Скриншот:
Кликните здесь для просмотра всего текста


Приложение простое и работает циклично. При его запуске создаётся и запускается таймер на 4 секунды, каждую секунду он уменьшается на секунду, отображая изменения в TextView. По завершении таймера вызывается метод method(), который после 5-секундной задержки запускает некоторые действия в отдельном потоке, а именно: отменяет старый таймер, создаёт новый и запускает его. Цикл повторяется по новой.

Если нажать на кнопку Back во время обратного отсчёта таймера, то таймер отменится и активити остановится. Вроде бы всё нормально.
НО если нажать на кнопку Back во время 5-секундной задержки (handler.postDelayed(..., 5000); ), то после остановки активити поток продолжит свою работу и бесконечный цикл продолжится. Это можно услышать по звуку. Т.е., как я понимаю, это утечка.

Каким образом нужно изменить код, чтобы от этой утечки избавиться? Я в потоках разбираюсь слабо, поэтому не смог ничего придумать...
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
10.10.2014, 14:48
Ответы с готовыми решениями:

Утечка памяти при использовании хандлера
new Handler().postDelayed(new Runnable() { @Override public void run() { textView.setText(&quot;&quot; + 666); } },...

Утечка памяти
Разработал программу, получилась достаточно большая, использует сторонние библиотеки, работает без сбоев, но появилась проблема с утечкой...

Утечка памяти
Работаю в Android Studio Подскажите как определить утекает ли память при работе с программой или нет. А то знакомые говорят после какого то...

2
2 / 2 / 0
Регистрация: 16.08.2013
Сообщений: 86
11.10.2014, 01:47  [ТС]
До чего же простым оказалось решение!
В onPause() добавить handler.removeCallbacksAndMessages(null) ;
0
 Аватар для dubok79
325 / 123 / 10
Регистрация: 01.11.2012
Сообщений: 587
13.10.2014, 09:14
Если следовать вот этой теме, то вы неправильно используете Handler. А handler.removeCallbacksAndMessages(null) ; я думаю просто костыль. Почитайте, там не сложно переделать в "Правильно".
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
13.10.2014, 09:14
Помогаю со студенческими работами здесь

Утечка памяти в Spiner
Здравствуйте. Создал новый проект в Layout добавил выпадающий список в ресурсы добавил массив значений списка, нового кода 0. Значения...

FragmentActivity -> DialogFragment (утечка памяти)
Всем привет! Обнаружил у себя такой баг: при повороте экрана - каждый раз увеличивается кол-во вызовов &quot;DF:...

Android WebView утечка памяти
При добавлении поддержки JavaScript setJavaScriptEnabled(true), когда перехожу по ссылкам, приложение начинает занимать очень много памяти,...

Activity + Service - утечка памяти?
Всем привет. Подскажите, пожалуйста, когда я запускаю сервис из активити (startService) и мой сервис работает достаточно долго, так...

Утечка памяти (или что-то еще)
Всем привет! Подскажите, пожалуйста, такой момент. Есть главная активность, на ней - 1 картинка. При нажатии на картинку - переходим на...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и источниками (напряжения, ЭДС и тока). Найти токи и напряжения во всех элементах. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru