<NME> StatusFragment.java
<BEF> package cgeo.geocaching;

import butterknife.ButterKnife;

import cgeo.geocaching.network.StatusUpdater;
import cgeo.geocaching.network.StatusUpdater.Status;

import android.content.Intent;
import android.content.res.Resources;
import android.net.Uri;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

import androidx.annotation.NonNull;
import androidx.fragment.app.Fragment;

import io.reactivex.rxjava3.disposables.CompositeDisposable;

public class StatusFragment extends Fragment {

    private final CompositeDisposable statusSubscription = new CompositeDisposable();
    private StatusBinding binding;

public class StatusFragment extends Fragment {

    private Subscription statusSubscription = Subscriptions.empty();

    @Override
    public View onCreateView(final LayoutInflater inflater, final ViewGroup container, final Bundle savedInstanceState) {
        super.onCreateView(inflater, container, savedInstanceState);
        final ViewGroup statusGroup = (ViewGroup) inflater.inflate(R.layout.status, container, false);
        final ImageView statusIcon = ButterKnife.findById(statusGroup, R.id.status_icon);
        final TextView statusMessage = ButterKnife.findById(statusGroup, R.id.status_message);
        statusSubscription = AndroidObservable.bindFragment(this, StatusUpdater.latestStatus)
                .subscribe(new Action1<Status>() {
                    @Override
                    if (status.icon != null) {
                        final int iconId = res.getIdentifier(status.icon, "drawable", packageName);
                        if (iconId != 0) {
                            binding.statusIcon.setImageResource(iconId);
                            binding.statusIcon.setVisibility(View.VISIBLE);
                        } else {
                            Log.w("StatusHandler: could not find icon corresponding to @drawable/" + status.icon);
                            binding.statusIcon.setVisibility(View.GONE);
                        }
                    } else {
                        binding.statusIcon.setVisibility(View.GONE);
                    }

                    String message = status.message;
                    if (status.messageId != null) {
                        final int messageId = res.getIdentifier(status.messageId, "string", packageName);
                        if (messageId != 0) {
                            message = res.getString(messageId);
                        }
                    }

                    binding.statusMessage.setText(message);
                    statusGroup.setVisibility(View.VISIBLE);

                    if (status.url != null) {
                        statusGroup.setOnClickListener(v -> startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(status.url)))); // don't use ShareUtils here. E.g. we want to redirect directly to PlayStore even if "use WebView" is set
                    } else {
                        statusGroup.setClickable(false);
                    }
                }));
        return statusGroup;
    }

    @Override
    public void onDestroyView() {
        statusSubscription.clear();
        super.onDestroyView();
    }

}
    public void onDestroyView() {
        statusSubscription.unsubscribe();
        super.onDestroyView();
    }

}

<MSG> Free resources when destroying status fragment

<DFF> @@ -1,6 +1,7 @@
 package cgeo.geocaching;
 
 import butterknife.ButterKnife;
+import butterknife.InjectView;
 
 import cgeo.geocaching.network.StatusUpdater;
 import cgeo.geocaching.network.StatusUpdater.Status;
@@ -25,14 +26,16 @@ import android.widget.TextView;
 
 public class StatusFragment extends Fragment {
 
+    protected @InjectView(R.id.status_icon) ImageView statusIcon;
+    protected @InjectView(R.id.status_message) TextView statusMessage;
+
     private Subscription statusSubscription = Subscriptions.empty();
 
     @Override
     public View onCreateView(final LayoutInflater inflater, final ViewGroup container, final Bundle savedInstanceState) {
         super.onCreateView(inflater, container, savedInstanceState);
         final ViewGroup statusGroup = (ViewGroup) inflater.inflate(R.layout.status, container, false);
-        final ImageView statusIcon = ButterKnife.findById(statusGroup, R.id.status_icon);
-        final TextView statusMessage = ButterKnife.findById(statusGroup, R.id.status_message);
+        ButterKnife.inject(this, statusGroup);
         statusSubscription = AndroidObservable.bindFragment(this, StatusUpdater.latestStatus)
                 .subscribe(new Action1<Status>() {
                     @Override
@@ -88,6 +91,7 @@ public class StatusFragment extends Fragment {
     public void onDestroyView() {
         statusSubscription.unsubscribe();
         super.onDestroyView();
+        ButterKnife.reset(this);
     }
 
 }

Free resources when destroying status fragment