我有以下代码,其中第二个“Callback”参数必须由调用者提供(我之所以用@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); }
}
});
}
Callback界面如下所示:
public interface Callback {
void onSuccess(Channel channel);
void onError(String channelId, Throwable throwable);
}
要回拨主叫方,我会像这样进行空检查
if (callback != null) { callback.onSuccess(channel); }
因为调用者可以在我的observable执行其后台工作时随时变为null。例如,调用者可能是一个可以暂停/销毁/垃圾收集的视图[Android有时会做有趣的事情],在这种情况下,我的代码会在没有空检查的情况下失败。
但Android Studio无法识别出这种可能性并显示Lint警告,它不允许我压制它。
似乎Android Studio没有意识到变量可能因其他原因而变为null,除了我自己的函数。好吧,我甚至承认它不应该是最终的,当这条线最初失败时我感到非常惊讶(我当时没有进行空检查,因为我相信它永远不会变为空)。
问题:尽管参数被注释为@Nonnull final,我怎么能告诉Android Studio抑制警告?
然后:如果有人能解释当底层引用变为null时,最终变量如何变为null。我的最终概念是变量被“克隆”并与上下文保持一致,这显然不会发生在这里。最终是“仅向前” - 这意味着我自己的代码不能再改变那个变量,但调用者仍然可以吗?
答案 0 :(得分:0)
我认为变量无法获取null,因为您传递的是Callback引用而不是WeakReference。 仍然如果Callback在一个单独的服务进程上执行,那么传递一个View作为回调将是不好的做法。 在最后一个注释中,您可以使用@SuppressLint()
强制删除lint