Retrofit - Call 接口与 Observable 接口
2026/8/12 20:38:58 网站建设 项目流程

一、Call 接口

Response<T>execute()
  1. execute 方法:同步执行,直接返回Response<T>。会阻塞,不能在主线程用
voidenqueue(Callback<T>callback)
  1. enqueue 方法:异步执行,回调里拿结果。Retrofit 自动切,网络请求在子线程,回调在主线程
voidcancel()
  1. cancel 方法:取消当前请求
booleanisCanceled()
  1. isCanceled 方法:是否已取消
booleanisExecuted()
  1. isExecuted 方法:是否已执行过
Call<T>clone()
  1. clone 方法:克隆一个新的 Call,因为原 Call 只能执行一次

二、创建 Observable

1、just 方法
(1)基本介绍
  • just 方法:直接发射已知数据
publicstatic<@NonNullT>Observable<T>just(@NonNullTitem1,@NonNullTitem2,@NonNullTitem3)
(2)演示
Observable<String>observable=Observable.just("Hello","World","!");observable.subscribe(s->System.out.println("just: "+s));
  • 输出结果
just: Hello just: World just: !
2、fromCallable 方法
(1)基本介绍
  • fromCallable 方法:同步任务转异步
publicstatic<@NonNullT>Observable<T>fromCallable(@NonNullCallable<?extendsT>callable)
(2)演示
Observable<String>observable=Observable.fromCallable(()->{Thread.sleep(1000);return"从数据库查询的结果";});observable.subscribe(s->System.out.println("fromCallable: "+s));
  • 输出结果
fromCallable: 从数据库查询的结果
3、fromIterable 方法
(1)基本介绍
  • fromIterable 方法:遍历集合逐个发射
publicstatic<@NonNullT>Observable<T>fromIterable(@NonNullIterable<?extendsT>source)
(2)演示
List<String>list=Arrays.asList("A","B","C");Observable<String>observable=Observable.fromIterable(list);observable.subscribe(s->System.out.println("fromIterable: "+s));
  • 输出结果
fromIterable: A fromIterable: B fromIterable: C
4、create 方法
(1)基本介绍
  • create 方法:自定义 Observable 发射数据
publicstatic<@NonNullT>Observable<T>create(@NonNullObservableOnSubscribe<T>source)
(2)演示
Observable<Object>observable=Observable.create(emitter->{emitter.onNext("第 1 个数据");emitter.onNext("第 2 个数据");emitter.onComplete();});observable.subscribe(data->System.out.println("create 收到:"+data),error->System.out.println("错误:"+error),()->System.out.println("完成!"));
  • 输出结果
create 收到:第 1 个数据 create 收到:第 2 个数据 完成!
5、defer 方法
(1)基本介绍
  • defer 方法:每次订阅都重新创建
publicstatic<@NonNullT>Observable<T>defer(@NonNullSupplier<?extends@NonNullObservableSource<?extendsT>>supplier)
(2)演示
Observable<Long>observable=Observable.defer(()->Observable.just(System.currentTimeMillis()));observable.subscribe(time->System.out.println("第 1 次:"+time));try{Thread.sleep(1000);}catch(InterruptedExceptione){e.printStackTrace();}observable.subscribe(time->System.out.println("第 2 次:"+time));
  • 输出结果
第 1 次:1786448460769 第 2 次:1786448461773
6、interval 方法
(1)基本介绍
  • interval 方法:定时轮询
publicstaticObservable<Long>interval(longperiod,@NonNullTimeUnitunit)
(2)演示
Observable<Long>observable=Observable.interval(1,TimeUnit.SECONDS);observable.take(3)// 只取前 3 个,避免无限输出.subscribe(num->System.out.println("心跳第 "+num+" 次"));
  • 输出结果
心跳第 0 次 心跳第 1 次 心跳第 2 次

三、Observable 转换操作

1、map 方法
(1)基本介绍
  • map 方法:1 对 1 转换
publicfinal<@NonNullR>Observable<R>map(@NonNullFunction<?superT,?extendsR>mapper)
(2)演示
Observable<String>observable=Observable.just("123");observable.map(s->Integer.parseInt(s)).map(i->i*2).subscribe(result->System.out.println("map 结果:"+result));
  • 输出结果
map 结果:246
2、flatMap 方法
(1)基本介绍
  • flatMap 方法:1 对 N 转换,不保证顺序
publicfinal<@NonNullR>Observable<R>flatMap(@NonNullFunction<?superT,?extendsObservableSource<?extendsR>>mapper)
(2)演示
Observable<String>observable=Observable.just("A","B");observable.flatMap(letter->Observable.just(letter+"1",letter+"2")).subscribe(s->System.out.println("flatMap: "+s));
  • 输出结果
flatMap: A1 flatMap: A2 flatMap: B1 flatMap: B2
(3)经典用法
  • App 有一个推荐关注列表,需要先获取 10 个用户的 ID,然后同时去服务器下载这 10 个人的头像
Observable.just(1,2,3,4,5,6,7,8,9,10).flatMap(userId->apiService.getUserAvatar(userId).subscribeOn(Schedulers.io())).subscribe(avatarUrl->{displayAvatar(avatarUrl);});
3、concatMap 方法
(1)基本介绍
  • concatMap 方法:1 对 N 转换,保证顺序
publicfinal<@NonNullR>Observable<R>concatMap(@NonNullFunction<?superT,?extendsObservableSource<?extendsR>>mapper)
(2)演示
Observable<String>observable=Observable.just("A","B","C");observable.concatMap(letter->Observable.just(letter+"1",letter+"2")).subscribe(s->System.out.println("concatMap: "+s));
  • 输出结果
concatMap: A1 concatMap: A2 concatMap: B1 concatMap: B2 concatMap: C1 concatMap: C2
4、buffer 方法
(1)基本介绍
  • buffer 方法:批量处理
publicfinalObservable<@NonNullList<T>>buffer(intcount)
(2)演示
Observable<Integer>observable=Observable.range(1,10);observable.buffer(3)// 每 3 个打包成 List.subscribe(list->System.out.println("buffer: "+list));
  • 输出结果
buffer: [1, 2, 3] buffer: [4, 5, 6] buffer: [7, 8, 9] buffer: [10]

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询