java - 如何使用改造处理空响应

标签 java android retrofit

有时我们从服务器收到的响应为 null 或空。正因为如此,我们的代码会在一些空指针异常时崩溃。我们不想在代码中到处进行空值检查。当改造响应为 null 或空时,有没有办法指定默认值?在下面的代码中,我们可以根据具体情况处理它。但是,我们不想为每个对象都编写此逻辑。我们想以某种方式在应用程序级别执行此操作。这可能吗?

@SerializedName("isPdf")
@Expose
private String isPdf;


public boolean getIsPdf() {
    return !Util.isNullOrEmpty(isPdf) && isPdf.equalsIgnoreCase("true") ? true : false;
}

public void setIsPDF(boolean isPdf) {

    this.isPdf = isPdf ? "true" : "false";
}

最佳答案

您可以创建一个默认回调,以您想要的方式处理空响应。例如,调用 onFailure:

public class DefaultCallback<T> implements Callback<T> {

    private static final String TAG = "YOUR_TAG";
    private Callback<T> callback;

    public DefaultCallback(Callback<T> callback) {
        this.callback = callback;
    }

    @Override
    public void onResponse(Call<T> call, Response<T> response) {
        if (response.body() == null) {
            callback.onFailure(call, new NullPointerException("Empty response"));
        } else {
            callback.onResponse(call, response);
        }
    }

    @Override
    public void onFailure(Call<T> call, Throwable t) {
        Log.e(TAG, t.toString());
        callback.onFailure(call, t);
    }
}

然后在您的实现中使用此回调。

Call<MyObject> call = ... //Create your call
call.enqueue(new DefaultCallback<>(new Callback<MyObject>() {
    @Override
    public void onResponse(Call<MyObject> call, Response<MyObject> response) {
        //Handle successful non-null responses
    }

    @Override
    public void onFailure(Call<MyObject> call, Throwable t) {
        //Handle errors/null responses
    }
}));

关于java - 如何使用改造处理空响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44973399/

相关文章:

java - NamedNodeMap 的通用 foreach 迭代

java - 内部类中的泛型类型

android - 需要 android.permission.ACCESS_ALL_DOWNLOADS 或 grantUriPermission()

java - 何时应该创建新的线程组

android - 使用 Retrofit 2 上传文件

retrofit - Kotlin Flow - Retrofit 与 Result 密封类的通用函数

带有httpurlconnection的android api 23中的Java rest api

java - Jsp线程安全的含义

android - Xamarin.Forms 滑动手势识别器

java - 如何在没有返回类型或回调的情况下执行 DELETE 请求? [ retrofit ]