У меня есть следующий код, где второй параметр «Обратный вызов» ДОЛЖЕН быть предоставлен вызывающим абонентом (причина, по которой я аннотировал его с помощью @Nonnull).
public static void load(@Nonnull final String channelId, @Nonnull final Callback callback) {
Observable.create(new Observable.OnSubscribe<Channel>() {
@Override public void call(Subscriber<? super Channel> subscriber) {
try {
Channel channel = new Channel().setApiChannel(MobileService.api().channels().get(channelId).execute(), UpdateFields.ALL);
subscriber.onNext(channel);
} catch (Exception e) {
subscriber.onError(e);
}
subscriber.onCompleted();
}
}).subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()). subscribe(new Subscriber<Channel>() {
@Override public void onCompleted() {
}
@Override public void onError(Throwable t) {
log.warning("could not load channelId = " + channelId + ", throwable = " + t.getMessage());
if (callback != null) { callback.onError(channelId, t); }
}
@Override public void onNext(Channel channel) {
if (callback != null) { callback.onSuccess(channel); }
}
});
}
Интерфейс обратного вызова выглядит следующим образом:
public interface Callback {
void onSuccess(Channel channel);
void onError(String channelId, Throwable throwable);
}
Чтобы перезвонить вызывающему абоненту, я делаю нулевую проверку, подобную этой
if (callback != null) { callback.onSuccess(channel); }
потому что вызывающий объект может стать нулевым в любое время, пока мой наблюдаемый выполняет свою фоновую работу. Например, вызывающим может быть представление, которое можно приостановить/уничтожить/собрать мусор [Android иногда делает забавные вещи], и в этом случае мой код не будет работать без проверки на null.
Но Android Studio не распознает такую возможность и отображает предупреждение Lint, которое также не позволяет мне подавить.
Кажется, Android Studio не понимает, что переменная может стать нулевой по другим причинам, кроме моей собственной функции. Ну, я даже признаю, что этого не должно быть, поскольку она окончательная, и я был очень удивлен, когда эта строка изначально не удалась (в тот момент у меня не было проверки на нуль, потому что я считал, что она никогда не может стать нулевой).
Вопрос. Как я могу указать Android Studio подавить предупреждение, несмотря на то, что параметр помечен как @Nonnull final?
И затем: если бы кто-нибудь мог объяснить, как конечная переменная может стать нулевой в любое время, когда базовая ссылка становится нулевой. Моя концепция final заключается в том, что переменная «клонируется» и сохраняется в контексте, чего здесь явно не происходит. Является ли final «только вперед» - это означает, что мой собственный код больше не может изменять эту переменную, но вызывающая сторона все еще может?