如何告诉Android Studio变量可能变为空?

时间:2015-05-17 01:50:59

标签: java android android-studio lint

我有以下代码,其中第二个“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警告,它不允许我压制它。

Callback

似乎Android Studio没有意识到变量可能因其他原因而变为null,除了我自己的函数。好吧,我甚至承认它不应该是最终的,当这条线最初失败时我感到非常惊讶(我当时没有进行空检查,因为我相信它永远不会变为空)。

问题:尽管参数被注释为@Nonnull final,我怎么能告诉Android Studio抑制警告?

然后:如果有人能解释当底层引用变为null时,最终变量如何变为null。我的最终概念是变量被“克隆”并与上下文保持一致,这显然不会发生在这里。最终是“仅向前” - 这意味着我自己的代码不能再改变那个变量,但调用者仍然可以吗?

1 个答案:

答案 0 :(得分:0)

我认为变量无法获取null,因为您传递的是Callback引用而不是WeakReference。 仍然如果Callback在一个单独的服务进程上执行,那么传递一个View作为回调将是不好的做法。 在最后一个注释中,您可以使用@SuppressLint()

强制删除lint