OkHttp库Callback接口(interface)声明为

public interface Callback {
  void onFailure(Request request, IOException e);
  void onResponse(Response response) throws IOException;
}

正如我最近在Callback failure for cancelled call in OkHttp中发现的那样,ontResponse方法中未处理的异常将被Call类吞噬

我对这个设计几乎没有疑问。

首先,为了强行在onResponse中捕获异常而不是抛出异常,最好不使用其他onResponse方法的声明,因为它们会被吞噬。

这是OkHttp Callback接口(interface)的设计缺陷,还是Java中的这种代码惯例?

其次,当http请求到达onResponse回调方法时,我希望那时候应该禁止取消请求。我会说这是一个错误。我对吗?

最佳答案

我也在为此苦苦挣扎,现在我已经解决了如下问题:

 client.newCall(request).enqueue(new Callback() {

            @Override
            public void onFailure(Call call, final IOException e) {
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        // AlertDialog, etc.
                    }
                });
            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {
            if (!response.isSuccessful()) {
                onFailure(call, new IOException("Unexpected code: " + response));
            }

                // else success

            }
        });

关键是在OnResponse中调用OnFailure。我无法以任何其他方式访问Exception(尽管可能还有其他方式;我认为这给OnFailure带来了更多的用处,并且我认为它传达了很好的 Intent )。请注意,可以出于其他原因调用OnFailure:https://square.github.io/okhttp/2.x/okhttp/com/squareup/okhttp/Callback.html

关于java - OkHttp回调会吞噬异常-设计缺陷或常见做法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32211555/

10-12 22:06