2013-09-05 4 views
3

У меня есть повторяющийся AnimatorSet, который использует последовательность изображений с полным кадром при нескольких различных действиях. Я получаю исключение из памяти, так как кажется, что изображения занимают слишком много памяти.android animatorset управление памятью, освобождение памяти из imageview

Первоначально деятельность в фоновом режиме все еще выполняла анимацию в петле, занимая память. Я попытался исправить, создав и завершая анимацию в режиме паузы/возобновления, чтобы память из анимаций в представлениях без переднего плана была исправлена, но я думаю, что мне нужно сделать больше, чтобы очистить изображения от памяти.

@Override 
protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_face_o_matic_start); 
     getActionBar().hide(); 

} 

@Override 
protected void onResume() { 
    super.onResume(); 
    createAnimations(); 
} 


@Override 
protected void onPause() { 
    super.onPause(); 
    this.mAnimatorSet.removeAllListeners(); 
    this.mAnimatorSet.end(); 
      //TODO: clear and free up the memory from the image views somehow 
      // this is the part I need help with I think 

} 

protected ObjectAnimator getGlowAnimation(View v, int duration){ 
    ObjectAnimator animation = ObjectAnimator.ofFloat(v, "alpha", 0f, 1f); 
    animation.setDuration(duration); 
    animation.setRepeatCount(1); 
    animation.setRepeatMode(Animation.REVERSE); 
    return animation; 
} 

public void createAnimations(){ 

    //TODO: destroy these imageviews to reclaim memory on pause 
      // originally had them in on create but the imageviews continued to 
      // take up memory when the activity went into the background 
    /*start animations */ 

    final ImageView bg1 = (ImageView) findViewById(R.id.bg_face_o_matic_1); 
    final ImageView bg2 = (ImageView) findViewById(R.id.bg_face_o_matic_2); 
    final ImageView bg3 = (ImageView) findViewById(R.id.bg_face_o_matic_3); 
    final ImageView bg4 = (ImageView) findViewById(R.id.bg_face_o_matic_4); 
    final ImageView bg5 = (ImageView) findViewById(R.id.bg_face_o_matic_5); 
    final ImageView bg6 = (ImageView) findViewById(R.id.bg_face_o_matic_6); 

    ObjectAnimator anim1 = getGlowAnimation(bg1, 400); 
    ObjectAnimator anim2 = getGlowAnimation(bg2, 400);  
    ObjectAnimator anim3 = getGlowAnimation(bg3, 400); 
    ObjectAnimator anim4 = getGlowAnimation(bg4, 400); 
    ObjectAnimator anim5 = getGlowAnimation(bg5, 400); 
    ObjectAnimator anim6 = getGlowAnimation(bg6, 400); 

    List<Animator> animations = new ArrayList<Animator>(Arrays.asList(anim1, anim2, anim3, anim4, anim5, anim6)); 
    mAnimatorSet.playSequentially(animations); 
      //loop the animator set 
    mAnimatorSet.addListener(new AnimatorListenerAdapter(){ 

     @Override 
     public void onAnimationEnd(Animator animation) { 
      super.onAnimationEnd(animation); 
      mAnimatorSet.start(); 

     } 

    }); 

    mAnimatorSet.start(); 
    /*end animations */ 
} 

ответ

0

Everytime ваше приложение входит в этот Activity он вызывает ваш onResume() метод, в котором он называет createAnimations(), следовательно, он постоянно создает множество образов и других вещей. Вы должны объявить некоторые вещи за пределами этого метода, объявить их на уровне класса и инициализировать их в onCreate(), так что это будет намного более эффективно. Я немного уменьшил ваш createAnimations(). И только этот метод вызывается один раз в onCreate() после инициализации его необходимые переменные зависимости и в вашем onResume() просто позвоните mAnimatorSet.playSequentially(animations);

public void createAnimations(){ 


    mAnimatorSet.playSequentially(animations); 
      //loop the animator set 
    mAnimatorSet.addListener(new AnimatorListenerAdapter(){ 

     @Override 
     public void onAnimationEnd(Animator animation) { 
      super.onAnimationEnd(animation); 
      mAnimatorSet.start(); 

     } 

    }); 
} 
+0

что я должен сделать, чтобы освободить память, первоначально я имел imageviews и то, что не в OnCreate, но он никогда не освобождал память при паузе, я перевел инициализацию изображений, чтобы возобновить, думая, что я буду разрушать образы изображений на паузе. Но я еще не продвинулся к уничтожающим изображениям, но пока что это половина. Я делаю, чтобы освободить изображения от изображений и объектных аниматоров при паузе? – MonkeyBonkey

+0

есть метод recycle() для изображений, но выполнение allocate/deallocate часто будет ухудшаться, я предложил включить их в onCreate, потому что вы используете их все время без изменений, так что их использование однажды будет работать, не запускайте их onResume(), поскольку он будет называться несколько раз, поэтому он будет работать хуже, а не выигрывать. –

+0

Деятельность в нашем случае возобновляется только один раз на сеанс пользователя (это конкретный вариант использования), и производительность до сих пор была достаточно хорошей для нас, но проблема с памятью была важной проблемой. Будет ли метод утилизации удалять изображения и освобождать память? если да, то как перераспределять на резюме? – MonkeyBonkey