Я получаю утечку памяти, когда начинаю переход с общими элементами из элемента утилизатора - PullRequest
2 голосов
/ 12 апреля 2019

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

1 Ответ

0 голосов
/ 12 апреля 2019

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

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

...