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

Recyclerview находится во фрагменте (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);
}
...

person josh    schedule 12.04.2019    source источник


Ответы (1)


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

Используйте эти ссылки для принятого ответа -> Обратный вызов от адаптера

person Mahabub Karim    schedule 12.04.2019
comment
Я удалил ссылку и заменил ее обратными вызовами, но сообщение об ошибке осталось прежним. - person josh; 22.04.2019