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

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

Войти
Регистрация
Восстановить пароль
Другие темы раздела
Программирование Android Можно ли рисовать лупу не во всех фрагментах? http://www.cyberforum.ru/android-dev/thread1272663.html
Недавно подключил ActionBar с поиском, использовал такой тьюториал: http://www.androidhive.info/2013/11/android-working-with-action-bar/. Всё нормально, приложение рисует лупу наверху, можно поискать...
Программирование Android Как вытащить данные из потока. Cant create handler inside thread that has not called Looper.prepare() В общем столкнулся со следующей неприятной проблемой. Есть клиент. Он запрашивает у сервера некоторые данные. Сервер эти данные посылает клиенту. Клиент эти данные принимает и продолжает слушать... http://www.cyberforum.ru/android-dev/thread1272616.html
Создать двумерный массив кнопок Программирование Android
можно ли как-то легко создать масив ХнаХ кнопок, при етом, чтоб легко можно было распознать какая кнопканажата ( к примеру, чтоб при нажатии кнопки из масива, выводило ее номера-положение в массиве)?
Сохранение введенных пользователем данных Программирование Android
Ребят прошу вашей помощи, возникла проблема, при записи введенных данных в текстовый файл, блок try{}catch(){} постоянно выдает исключение в чем может быть проблема? код Main: public class...
Программирование Android Upload to server http://www.cyberforum.ru/android-dev/thread1272263.html
Доброго всем вечера! Столкнулся с такой проблемой: делаю загрузку файла на сервер в сеовисе, но загвоздка в том что файлы больше 600кб не грузятся, пробовал разные способы и разные сервера, результат...
Программирование Android ERROR: x86 emulation currently requires hardware acceleration Здравствуйте. Помогите пожалуйста разобраться с ошибкой. До того как я столкнулся с этой ошибкой , эмуляторы на платформе "Intel Atom(x86) запускались нормально. Я пытался установить библиотеку... подробнее

Показать сообщение отдельно
Paket236
2 / 2 / 0
Регистрация: 16.08.2013
Сообщений: 52

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

10.10.2014, 14:48. Просмотров 800. Ответов 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>

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

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


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

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

Каким образом нужно изменить код, чтобы от этой утечки избавиться? Я в потоках разбираюсь слабо, поэтому не смог ничего придумать...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru