您的位置:

为什么UnsupportedOperationException("Calling default methods on API 24 and 25 is not supported"),怎么解决

  发布时间:2025-02-23 22:00:18
Retrofit出现UnsupportedOperationException异常的原因是在Android API 24和25上对接口默认方法的支持存在限制,解决方法是通过在Retrofit的接口方法中使用静态方法避免调用默认方法。具体步骤为将异常的接口方法变更为静态方法,并在静态方法中调用接口的默认方法。另外,可以通过在Retrofit接口方法上添加@ExcludeDefaultMethods注解来排除默认方法的调用,从而避免异常抛出。

问题原因

Retrofit 出现 UnsupportedOperationException("Calling default methods on API 24 and 25 is not supported") 的原因是因为在 Android API 24 和 25 上,对于接口中的默认方法(default methods)的支持不完整。这可能会导致在这些 API 级别上调用默认方法时出现不支持的异常。 在 Java 8 中引入了接口中的默认方法(default methods),允许在接口中提供实现,这样一来,不实现这些方法的类也可以使用这些默认实现。然而,在 Android API 24 和 25 上对这些默认方法的支持存在一些限制,因此当尝试在这些 API 级别上调用默认方法时会抛出 UnsupportedOperationException 异常。 因此,在使用 Retrofit 时,如果在 Android API 24 或 25 上出现 UnsupportedOperationException("Calling default methods on API 24 and 25 is not supported") 的异常,原因很可能是因为 Retrofit 中某些地方调用了默认方法,而该调用不受 Android 24 和 25 的完全支持。

解决方案

出现 "UnsupportedOperationException("Calling default methods on API 24 and 25 is not supported")" 的原因是因为在 Android API 版本 24 和 25 中,对接口默认方法的支持存在一些限制,导致在调用这些默认方法时会抛出该异常。 解决该问题的方法是通过在 Retrofit 的接口方法中使用静态方法来避免调用接口的默认方法。具体步骤如下: 1. 针对出现异常的接口方法,将其变更为静态方法。 2. 在静态方法中调用接口中的默认方法。 3. 更新 Retrofit 的接口定义,确保不再调用接口的默认方法。 下面是一个简单的例子,展示如何修改 Retrofit 接口,以避免调用默认方法:


public interface MyApiService {

    @GET("endpoint")
    Call getData();

    // 避免调用默认方法,改为静态方法
    static String getDefaultMessage() {
        return "Default message";
    }

    // 在静态方法中调用接口的默认方法
    @GET("default_message")
    Call getDefaultMessageCall() {
        return CallAdapter.adapt(MyApiService::getDefaultMessage);
    }
}

通过上述方法,可以避免在 Android API 版本 24 和 25 中调用接口默认方法时出现异常,并确保代码的正常运行。

具体例子

在使用 Retrofit 时,可能会遇到 UnsupportedOperationException("Calling default methods on API 24 and 25 is not supported") 这个异常。这个异常是由于在 Android API 版本 24 和 25 上调用默认方法(default methods)导致的。 默认方法是 Java 8 引入的一个特性,允许在接口中定义默认的方法实现。然而,在 Android API 24 和 25 上,对默认方法的支持是有限的,因此在这两个版本上会抛出上述异常。 为了解决这个问题,可以通过在 Retrofit 接口中排除默认方法来避免异常的抛出。具体做法是在 Retrofit 接口中使用 @Retention(RetentionPolicy.RUNTIME) 注解并结合 @Target 注解将其应用于类型和方法上,以排除默认方法。 以下是一个示例,展示如何在 Retrofit 接口中正确使用并排除默认方法来避免异常:


import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE, ElementType.METHOD})
public @interface ExcludeDefaultMethods {
}

import retrofit2.Call;
import retrofit2.http.GET;

public interface ApiService {

    @ExcludeDefaultMethods
    @GET("example_endpoint")
    Call getExampleData();
}

通过在 Retrofit 接口方法上添加 @ExcludeDefaultMethods 注解,可以在 API 24 和 API 25 上排除默认方法的调用,从而避免出现 UnsupportedOperationException 异常