У меня есть повторяющийся 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 */
}
что я должен сделать, чтобы освободить память, первоначально я имел imageviews и то, что не в OnCreate, но он никогда не освобождал память при паузе, я перевел инициализацию изображений, чтобы возобновить, думая, что я буду разрушать образы изображений на паузе. Но я еще не продвинулся к уничтожающим изображениям, но пока что это половина. Я делаю, чтобы освободить изображения от изображений и объектных аниматоров при паузе? – MonkeyBonkey
есть метод recycle() для изображений, но выполнение allocate/deallocate часто будет ухудшаться, я предложил включить их в onCreate, потому что вы используете их все время без изменений, так что их использование однажды будет работать, не запускайте их onResume(), поскольку он будет называться несколько раз, поэтому он будет работать хуже, а не выигрывать. –
Деятельность в нашем случае возобновляется только один раз на сеанс пользователя (это конкретный вариант использования), и производительность до сих пор была достаточно хорошей для нас, но проблема с памятью была важной проблемой. Будет ли метод утилизации удалять изображения и освобождать память? если да, то как перераспределять на резюме? – MonkeyBonkey