解决--No instance field forceOldAnimationCode of type Z in class ImageDecodeOptions

在使用Fresco加载GIF动图时遇到错误,原因是forceOldAnimationCode字段被移除。解决方案是统一所有Fresco相关库的版本。

项目最近有个需求,需要增加动图功能。目前支持动图的图片加载框架一个是Glide,一个是Fresco。动手写Demo时,发现用Fresco加载Gif图片时报了下面的错。在官方issue上面找到了这个问题的原因,原来是我使用的Fresco版本问题。forceOldAnimationCode这个属性已经被移除了,所以找不到了。
解决办法:确保引入的所有Fresco相关的库的版本号都是一样的。
附上官方issue链接:
https://github.com/facebook/fresco/issues/1660

7-18 15:11:20.297 14207-14358/com.example.huanglin.dynamicimagedemo E/AndroidRuntime: FATAL EXCEPTION: Thread-24794
Process: com.example.huanglin.dynamicimagedemo, PID: 14207
java.lang.NoSuchFieldError: No instance field forceOldAnimationCode of type Z in class Lcom/facebook/imagepipeline/common/ImageDecodeOptions; or its superclasses (declaration of ‘com.facebook.imagepipeline.common.ImageDecodeOptions’ appears in/data/app/com.example.huanglin.dynamicimagedemo-1/base.apk)
at com.facebook.imagepipeline.animated.factory.AnimatedImageFactoryImpl.decodeGif(AnimatedImageFactoryImpl.java:84)
at com.facebook.imagepipeline.decoder.DefaultImageDecoder.decodeGif(DefaultImageDecoder.java:145)
at com.facebook.imagepipeline.decoder.DefaultImageDecoder 1.decode(DefaultImageDecoder.java:65)atcom.facebook.imagepipeline.decoder.DefaultImageDecoder.decode(DefaultImageDecoder.java:126)atcom.facebook.imagepipeline.producers.DecodeProducer ProgressiveDecoder.doDecode(DecodeProducer.java:240)
at com.facebook.imagepipeline.producers.DecodeProducer ProgressiveDecoder.access 200(DecodeProducer.java:112)
at com.facebook.imagepipeline.producers.DecodeProducer ProgressiveDecoder 1.run(DecodeProducer.java:145)
at com.facebook.imagepipeline.producers.JobScheduler.doJob(JobScheduler.java:207)
at com.facebook.imagepipeline.producers.JobScheduler.access 000(JobScheduler.java:27)atcom.facebook.imagepipeline.producers.JobScheduler 1.run(JobScheduler.java:78)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)
at java.util.concurrent.ThreadPoolExecutor Worker.run(ThreadPoolExecutor.java:588)atcom.facebook.imagepipeline.core.PriorityThreadFactory 1.run(PriorityThreadFactory.java:43)
at java.lang.Thread.run(Thread.java:833)

这个问题通常出现在使用 Spring Cloud OpenFeign 时,当你为 Feign Client 配置了 `fallbackFactory`,但 Spring 容器中没有找到该类型的实例。这个错误提示如下: ``` No fallbackFactory instance of type class com.example.MyFeignClientFallbackFactory found for feign client com.example.MyFeignClient ``` --- ### 原因分析 在 Feign Client 中使用了如下注解: ```java @FeignClient(name = "service-name", fallbackFactory = MyFeignClientFallbackFactory.class) ``` 但 Spring 容器中没有注册 `MyFeignClientFallbackFactory` 这个类的 Bean。 --- ### 解决方案 #### ✅ 步骤 1:定义 FallbackFactory 实现类 ```java import feign.hystrix.FallbackFactory; import org.springframework.stereotype.Component; @Component public class MyFeignClientFallbackFactory implements FallbackFactory<MyFeignClient> { @Override public MyFeignClient create(Throwable cause) { return new MyFeignClient() { @Override public String someMethod() { return "Fallback response due to: " + cause.getMessage(); } }; } } ``` 注意:这个类必须加上 `@Component` 注解,确保它能被 Spring 管理。 --- #### ✅ 步骤 2:FeignClient 接口中正确引用 fallbackFactory ```java import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.GetMapping; @FeignClient(name = "some-service", fallbackFactory = MyFeignClientFallbackFactory.class) public interface MyFeignClient { @GetMapping("/api") String someMethod(); } ``` --- #### ✅ 步骤 3:确保启用 Feign Clients 在启动类上添加: ```java @EnableFeignClients @SpringBootApplication public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } } ``` --- #### ✅ 步骤 4:Maven 依赖检查(Spring Cloud 2020 之后) 如果你使用的是 Spring Boot 2.4+ 和 Spring Cloud 2020+,请确保引入了正确的依赖: ```xml <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency> ``` > 如果你使用的是 Spring Cloud Netflix Hystrix,请额外添加 `spring-cloud-starter-netflix-hystrix`,并在配置文件中开启 Hystrix: ```yaml feign: client: config: default: hystrix: enabled: true ``` --- ### 补充说明 - **FallbackFactory 的作用**:它允许你在 Feign 调用失败时返回一个默认实现(例如降级逻辑)。 - **为什么需要 `@Component`**:只有注册为 Spring Bean,Feign 才能在运行时找到它并注入。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值