Я получаю утечку памяти, когда начинаю переход с общими элементами из элемента утилизатора

2

Обзор переработчика находится во фрагменте (androidx), прикрепленном к основному виду деятельности. Это часть адаптера вторичной переработки, от которой называется новое действие:

MainActivity activity;

@Override
public void onBindViewHolder(final MyRecyclerAdapter.ViewHolder viewHolder, final int position) {
    final View background = viewHolder.background;

    ViewCompat.setTransitionName(background,"background_" + position);

    background.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent intent = new Intent(activity, DetailActivity.class);
            Bundle options = ActivityOptionsCompat.makeSceneTransitionAnimation(activity, background, "background_" + position).toBundle();
            activity.startActivity(intent, options);
        }
    }
}

Это ошибка, которую я получаю (один раз для каждого общего элемента, который я передаю в ActivityOptionsCompat):

E/BufferItemConsumer: [unnamed-29987-0] Не удалось освободить буфер: неизвестная ошибка -1 (1)

Эта ошибка дает мне каждый раз, когда вы вызываете "finishAfterTransition();" ошибка, при которой текущее окно теряет фокус

Редактировать: как предложил Махабуб Карим, я заменил ссылку на занятие обратным вызовом (к сожалению, это не меняет сообщение об ошибке):

//Adapter Class

OnItemClickListener onItemClickListener;

public static interface OnItemClickListener {
    public abstract void onItemClicked(MyRecyclerAdapter.ViewHolder viewHolder, int position);
}

@Override
public void onBindViewHolder(final MyRecyclerAdapter.ViewHolder viewHolder, final int position) {
    final View background = viewHolder.background;

    ViewCompat.setTransitionName(background,"background_" + position);

    background.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            onItemClickListener.onItemClicked(viewHolder,position);
        }
    }
}

public void setListener(OnItemClickListener onItemClickListener){
    this.onItemClickListener = onItemClickListener;
}
//MainActivity Class

...
@Override
public void onItemClicked(MyRecyclerAdapter.ViewHolder viewHolder, int position) {
    final View background = viewHolder.background;
    Intent intent = new Intent(this, DetailActivity.class);
    Bundle options = ActivityOptionsCompat.makeSceneTransitionAnimation(this, background, "background_" + position).toBundle();
    startActivity(intent, options);
}
...
Теги:
android-recyclerview
memory-leaks
androidx
activity-transition

1 ответ

0

Никогда не выполняйте действия или ссылки фрагмента на адаптер, потому что это создает циклическую зависимость, означает, что активность использует ссылку на адаптер, а адаптер принимает ссылку на активность, поэтому нет возможности покинуть память. Всегда каждый берет ссылку на память. Вместо этого используйте метод обратного вызова, который будет реализован по активности прослушивателя адаптера.

По этой ссылке принят ответ → Обратный звонок от адаптера

  • 0
    Я удалил ссылку и заменил ее обратными вызовами, но сообщение об ошибке остается прежним

Ещё вопросы

Сообщество Overcoder
Наверх
Меню