Модераторы: javastic
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Admob. Утечка памяти. 
:(
    Опции темы
asd
Дата 26.8.2014, 15:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 89
Регистрация: 25.6.2006

Репутация: нет
Всего: 1



Простейший код. При смене ориентации экрана(любое пересоздание Activity) утекает память. Eclipse Memory Analyzer показывает что кто-то держит старый объект Activity и не даёт его освободить. Если не вызывать load, то всё нормально освобождается. 

Код

package pav.test.leaktest;

import com.google.android.gms.ads.AdRequest;
import com.google.android.gms.ads.InterstitialAd;

import android.os.Bundle;
import android.app.Activity;

public class MainActivity extends Activity {

    private InterstitialAd interstitial;
    int[] asd = new int [1000000];
    

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        interstitial = new InterstitialAd(this);
        interstitial.setAdUnitId("");        
        AdRequest adRequest = new AdRequest.Builder().build();
        interstitial.loadAd(adRequest);    // если закоментировать, то утечки не будет    
    }
}


В принципе понятно что причина в этом InterstitialAd(this); Если не вызывать load, то перекрёстная ссылка как-то обрабатывается, а если вызвать, то в  interstitial, наверное, создаётся какой-нибудь поток, который не даёт всему освободиться.

Кто сталкивался, как лечить? 
PM MAIL   Вверх
igorka
Дата 27.8.2014, 09:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 38
Регистрация: 28.6.2007

Репутация: нет
Всего: нет



Может есть смысл убрать  private InterstitialAd interstitial; из полей класса? 
Зачем он там?


PM MAIL   Вверх
asd
Дата 27.8.2014, 10:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 89
Регистрация: 25.6.2006

Репутация: нет
Всего: 1



Он там для последующего использования. Но даже если переместить в onCreate(просто ради теста), то ничего не изменится.

Есть вот такое решение http://stackoverflow.com/questions/2446344...ial-memory-leak Однако после прочтения этой ветки(и ссылкам из неё) http://stackoverflow.com/questions/7298731...ication-context у меня сложилось впечатление, что окончательно это проблемы не решит. Во-первых не факт что использовать другой контекст безопасно, а во-вторых я так понимаю сам объект InterstitialAd будет утекать. Нужно либо найти какой-то способ заставить InterstitialAd завершить все свои операции, либо вообще выносить создание и хранение этих объектов в какой-нибудь синглтон. 

Меня больше всего смущает то, что по этой проблеме почти нет обсуждений в интернете. Не может же такого быть, чтобы такая утечка никого не волновала. Следовательно я чего-то принципиально не понимаю в том, как надо с InterstitialAd обращаться. Хотя где тут можно накосячить я понятия не имею.

PM MAIL   Вверх
Dapo
Дата 27.8.2014, 20:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 417
Регистрация: 18.4.2002

Репутация: 1
Всего: 1



действительно интересно.. поискал решения в интернете и тоже готового решения не нашел. подумал использовать onSave(Restore)InstanceState, но ссылка на контекст делает этот метод бесполезным (кроме того надо еще и парселабл прикручивать). Может оно и не надо? Освободиться память самостоятельно когда сессия закончиться? Или там значительна утечка, что через 3-4 поворота приложение падает? Растет куча при частых поворотах? Кстати, все таки с getApplicationContext в случае с onSave(Restore)InstanceState можно попробовать костыль. 
PM MAIL   Вверх
asd
Дата 28.8.2014, 07:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 89
Регистрация: 25.6.2006

Репутация: нет
Всего: 1



Если честно, не понял что вы предлагаете делать в onSave(Restore)InstanceState.

Утечка равна размеру класса который передаётся как контекст при создании InterstitialAd. Конкретно у меня в рабочем приложении, где я заметил этот баг, это примерно 1 метр(в основном графика). Это приводит к 2-3 падениям из-за нехватки памяти в день на 2500 сеансов(статистика Google Analytics). конкретно на моём телефоне(1 гиг памяти) падает примерно на 30 цикле пересоздания Activity.


C getApplicationContext всё работает норм. Только скорее всего сам объект InterstitialAd продолжит утекать. 
PM MAIL   Вверх
Dapo
Дата 30.8.2014, 16:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 417
Регистрация: 18.4.2002

Репутация: 1
Всего: 1



на Save(Restore) можно попробовать такой костыль: наследуетесь от InterstitialAd с интерфейсом Parcelable. в онСэйв сохраняете его в Bundle на онРесторе восстанавливаете. Тогда ваш Ad создаваться не будет. Только не забудьте его на null проверить. Ну и это лишь непроверенная идея )
PM MAIL   Вверх
PiyodaiSiyo
Дата 1.9.2014, 00:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 112
Регистрация: 31.12.2009

Репутация: 1
Всего: 2



может  в манифесте в активити попробовать 
Код

android:noHistory="true" 

чтоб не кэшировалось
или вообще в application
Код

android:largeHeap="true"


Это сообщение отредактировал(а) PiyodaiSiyo - 1.9.2014, 00:26
PM MAIL   Вверх
asd
Дата 15.9.2014, 14:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 89
Регистрация: 25.6.2006

Репутация: нет
Всего: 1



По результатам:
Сделал так:
interstitial = new InterstitialAd(getApplicationContext());
Утечка пропадает. Падения прекратились.


Также, если у вас в коде есть 
Код

    AdListener interstitialListener = new AdListener() {
        @Override
        public void onAdClosed() {
        }        

        @Override
        public void onAdFailedToLoad(int errorCode){
        }
    };


то обработчик нужно ставить/убирать в onResume/onPause

в onResume()
interstitial.setAdListener(interstitialListener);

в onPause() 
interstitial.setAdListener(null);

Иначе память опять начинает утекать.

PM MAIL   Вверх
asd
Дата 16.9.2014, 15:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 89
Регистрация: 25.6.2006

Репутация: нет
Всего: 1



А вот и первые последствия использования getApplicationContext() вместо this:) 

android.util.AndroidRuntimeException: Calling startActivity() from outside of an Activity context requires the FLAG_ACTIVITY_NEW_TASK flag. Is this really what you want?
at android.app.ContextImpl.startActivity(ContextImpl.java:959)
at android.content.ContextWrapper.startActivity(ContextWrapper.java:283)
at aaa.a(SourceFile:87)
at xx.q(SourceFile:624)
at yh.onTransact(SourceFile:121)
at android.os.Binder.transact(Binder.java:297)
at com.google.android.gms.internal.ac$a$a.showInterstitial(Unknown Source)
at com.google.android.gms.internal.ah.show(Unknown Source)
at com.google.android.gms.ads.InterstitialAd.show(Unknown Source)
at pav.projects.supportlibrary.GameHome.interstitialShow(GameHome.java:238)
at pav.projects.nanogramlib.NanogramHome.onFieldFull(NanogramHome.java:441)
at pav.projects.nanogramlib.GameField.onUpEvent(GameField.java:515)
at pav.projects.nanogramlib.GameField.onTouchEvent(GameField.java:536)
at android.view.View.dispatchTouchEvent(View.java:5595)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:1970)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1739)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:1970)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1739)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:1970)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1739)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:1970)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1739)
at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:2125)
at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1403)
at android.app.Activity.dispatchTouchEvent(Activity.java:2369)
at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:2073)
at android.view.View.dispatchPointerEvent(View.java:5775)
at android.view.ViewRootImpl.deliverPointerEvent(ViewRootImpl.java:3141)
at android.view.ViewRootImpl.handleMessage(ViewRootImpl.java:2650)
at android.view.ViewRootImpl.processInputEvents(ViewRootImpl.java:1017)
at android.view.ViewRootImpl.handleMessage(ViewRootImpl.java:2659)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:4514)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:980)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:747)
at dalvik.system.NativeStart.main(Native Method)

Пока таких репортов 2.
PM MAIL   Вверх
motoklas329
Дата 26.9.2014, 10:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 21.9.2014
Где: Киев

Репутация: нет
Всего: нет



Посоветуйте язык програмирование для новичка.
PM MAIL WWW   Вверх
igorka
Дата 29.9.2014, 18:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 38
Регистрация: 28.6.2007

Репутация: нет
Всего: нет



Цитата(motoklas329 @ 26.9.2014,  10:58)
Посоветуйте язык програмирование для новичка.

PASCAL жеж
PM MAIL   Вверх
Burka
Дата 8.10.2014, 13:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 429
Регистрация: 11.5.2007

Репутация: нет
Всего: 2



asd, а какую версию сдк ты используешь? повторяется ли это в последней ревизии гугл сервисов?


--------------------
Великие умы обсуждают идеи; средние умы обсуждают события; мелкие умы обсуждают людей.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Android | Следующая тема »


 




[ Время генерации скрипта: 0.0694 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.