retrofit2+RxJava简单使用
16lz
2021-01-23
刚学习Android的网络开发,记录起来,作个纪念。
资源:
retrofit2学习: http://square.github.io/retrofit/
RxJAVA学习: http://gank.io/post/560e15be2dca930e00da1083
使用Android Studio开发。
1. 配置build.gradle
compile 'com.squareup.retrofit2:retrofit:2.1.0' compile 'com.squareup.retrofit2:converter-gson:2.1.0' compile 'com.squareup.retrofit2:adapter-rxjava:2.1.0' compile 'io.reactivex:rxjava:1.1.3' compile 'io.reactivex:rxandroid:1.1.0'
2. 后台服务代码(Python)
只为测试,写得比较简单.使用的是bottle轻量级服务框架
设置了一个记数器,每次请求,返回的数都将加1
import jsonfrom bottle import route, run @route('/app/v1/game/new')def new_game(): new_game.counter += 1 return json.dumps(["liuzhiliang" + str(new_game.counter)])if __name__ == '__main__': # 定义记数器 new_game.counter = 0 # 运行服务 run(host='0.0.0.0', port=8421)
3. 设置接口
设置两种接口类型,一种是Call,使用retrofit2自带的处理,一种是rx.Observable, 使用RxJAVA调用方式。 需要注意的是,他们调的是同一个接口!
package com.example.jerome.chess;import java.util.List;import retrofit2.Call;import retrofit2.http.GET;import rx.Observable;/** * Created by jerome on 16/8/25. */public interface GameApi { @GET("/app/v1/game/new") Observable> newGame(); @GET("/app/v1/game/new") Call> newGame1();}
4. 获取接口实现
数据统一使用Gson来转换。
public static T createService(String baseUrl, Class cls){ Retrofit retrofit = new Retrofit.Builder() .baseUrl(baseUrl) .addCallAdapterFactory(RxJavaCallAdapterFactory.create()) //rxjava 时添加 .addConverterFactory(GsonConverterFactory.create()) .build(); return retrofit.create(cls); }
调用生成代码
GameApi service = createService(baseUrl, GameApi.class);
5. Call调用方式封装
public static void RunCall(GameApi service){ service.newGame1().enqueue( new Callback>(){ @Override public void onResponse(Call> call, Response> response) { for(String a : response.body()) System.out.println("Call: " +a); } @Override public void onFailure(Call> call, Throwable t) { System.out.println("1 error: " + t.getMessage()); } } ); }
6. RxJAVA调用方式封装
public static void RunRxJava(GameApi service){ service.newGame() .subscribeOn(Schedulers.io()) .subscribe(new Subscriber>() { @Override public void onCompleted() { System.out.println("onCompleted: "); } @Override public void onError(Throwable e) { System.out.println("onError:" + e.getMessage()); } @Override public void onNext(List strings) { for (String a : strings) System.out.println("RXJAVA: " + a); } }); }
7. 测试函数
public static void main(String[] args){ String baseUrl = "http://127.0.0.1:8421/"; GameApi service = createService(baseUrl, GameApi.class); for(int i = 0; i < 5; i++) RunCall(service); for(int i = 0; i < 5; i++) RunRxJava(service); }
8. 程序输出
Call: liuzhiliang5Call: liuzhiliang2Call: liuzhiliang1Call: liuzhiliang4RXJAVA: liuzhiliang6Call: liuzhiliang3onCompleted: RXJAVA: liuzhiliang7onCompleted: RXJAVA: liuzhiliang8onCompleted: RXJAVA: liuzhiliang9onCompleted: RXJAVA: liuzhiliang10onCompleted: Process finished with exit code 0
更多相关文章
- Android中界面实现全屏显示的两种方式
- Android 驱动之旅 第四章:在Android 系统中编写JNI 方法在应用程
- 一种绕过Android P对非SDK接口限制的简单方法
- Android笔记:Android后台接口教程一(从零开始学习Android后台接口)A
- Android 的广播机制和两种注册方式
- Android的几种通讯方式
- android进行主题切换不重启整个应用(style方式)
- 用c/c++混合编程方式为ios/android实现一个自绘日期选择控件(一)
- Dagger2 在 Android 项目的正确使用方式【完整篇】