У меня есть ViewHolder
, который регистрируется как приемник для LocalBroadcastManager
. У ViewHolder
также есть делегат от Activity
, который содержит RecyclerView
.
Это вызывает утечку памяти, потому что мне не удается отменить регистрацию диспетчера вещания в держателе представления, когда действие уничтожается.
public class MyHolder extends RecyclerView.ViewHolder {
public interface Delegate {
...
}
private @Nullable Delegate delegate;
public MyHolder(@NonNull View itemView) {
super(itemView);
}
public void bind(@NonNull Delegate delegate) {
this.delegate = delegate;
registerNotifications();
}
public void recycle() {
unregisterNotifications();
delegate = null;
}
private void registerNotifications() {
LocalBroadcastManager.getInstance(App.getInstance().getApplicationContext()).registerReceiver(broadcastReceiver, new IntentFilter(MyFilter));
}
private void unregisterNotifications() {
LocalBroadcastManager.getInstance(App.getInstance().getApplicationContext()).unregisterReceiver(broadcastReceiver);
}
private BroadcastReceiver broadcastReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
...
}
};
}
Я пытался позвонить recycle
в onViewDetachedFromWindow
и onViewRecycled
RecyclerView.Adapter
. Но похоже, что нет никакой гарантии, что какой-либо из них будет вызван при уничтожении активности.
Как я могу убедиться, что широковещательный приемник правильно отменяется при уничтожении активности или повторном использовании ViewHolder?