retrofit2+rxjava的结合使用
16lz
2021-01-26
因为retrofit2+rxjava的结合使用是现在主流的使用方法,所以最近在网上翻阅好多相关资料,现在整理如下.
1.创建一个实体类
public class demobean { private String login; private int id;
}
2.创建一个获取返回数据的泛型(就是对返回数据的封装解析)
public class BaseRequest<T> { @SerializedName("data") //这个就类似 {data:[{}],code:} 就是头 public List<T> managerList; //这个就是对应的写法封装 @SerializedName("msg") public String msg;}
3.创建请求网络的封装类(个人封装)
public class RetrofitGen { public static String BASE_URL = "这里填的是主机头部分"; public static <T> T create(final Class<T> cls) { Retrofit.Builder builder = new Retrofit.Builder(); Retrofit retrofit = builder .baseUrl(BASE_URL)//注意此处,设置服务器的地址 .addConverterFactory(GsonConverterFactory.create())//用于Json数据的转换,非必须 .addCallAdapterFactory(RxJavaCallAdapterFactory.create())//用于返回Rxjava调用,非必须 .build(); return retrofit.create(cls); }}
4.创建一个请求网址的接口包括get请求和post请求
下面的可以填写实体类demobean 也可以填写ResponseBody
@Query 表示这是一个参数
@Body 表示将requestBean对象转成成json string作为参数传递给后台
@QueryMap 表示将map类型的params对象,转成键值对的形式作为参数传递给后台
public interface Api {
//这里就是填写下面的东西}
retrofit2:
get请求
@GET("这里填除掉主机头部分后面的")Call<demobean> getApitest(@Query("demo") String h1, @Query("demo1") String h2);
//getApi方法,等效于: http://192.168.8.202:8082/这里填除掉主机头部分后面的?demo=h1&demo1=h2
@GET("这里填除掉主机头部分后面的")Call<demobean> getApiStringtest(@QueryMap Mapparams);
post请求
@POST("这里填除掉主机头部分后面的")Call<demobean> postApiString(@Body demobean requestBean);
@POST("这里填除掉主机头部分后面的")Call<demobean> postApi(@Body demobean requestBean);
//这里的是文件上传
//这个是单文件上传格式@Multipart@POST("这里填除掉主机头部分后面的")Call<ResponseBody> uploadSimpleFile(@Part MultipartBody.Part file);//多文件上传@Multipart@POST("这里填除掉主机头部分后面的")Call<ResponseBody> uploads(@PartMap MapRequestBody> params);
还可以这样写
这里都是get请求:post同理
Call> retrofits(@Path("hjc") String v1, @Path("hjc1") String v2);
Observable> RxJavas(@Path("hjc") String v1, @Path("hjc1") String v2);
rxjava:
//Observable 是RxJava的关键点,其他不变
get请求:
@GET("这里填除掉主机头部分后面的")Observable<demobean> getRxJavaApi(@QueryMap Mapparams);
post请求:
@POST("这里填除掉主机头部分后面的")Observable<demobean> postRxJavaApi(@Body Contributor requestBean);
5.使用
现在是rxjava+retrofit2结合使用请求服务器
get请求传参数:
Api api = RetrofitGen .create(Api.class);// Api api = retrofit.create(Api.class); api.getApitest("square","retrofit")//填写参数 .subscribeOn(Schedulers.io())//开启线程 .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Subscriber<BaseRequest<List>>() { @Override public void onCompleted() { } @Override public void onError(Throwable e) { } @Override public void onNext(BaseRequest<List> contributors) {
//获得返回数据
for (demo c : contributors){ Log.e("c",c.getLogin()+c.getContributions()+c.getId()); tv_showen.setText(c.getLogin()+c.getContributions()+c.getId()+ ""); } } });
retrofit2 使用:
Call<BaseRequest>>
call = api.contributors("square","retrofit");
call.enqueue(new Callback>() { @Override public void onResponse(Call
> call, Response
> response) { tv_showen.setText(response.body().toString()); @Override public void onFailure(Call
> call, Throwable t) { }});
键值对请求方法
Mapparams = new HashMap<>(); params.put("111", "vvv");params.put("222", "vvv2");CallapiString = api.getApiString(params); apiString.enqueue(new Callback() { @Override public void onResponse(Callcall, Response Log.e("", ""); try { Log.e("response",response.body().string()); } catch (IOException e) { e.printStackTrace(); } } @Override public void onFailure(Callresponse) { call, Throwable t) { Log.e("", ""); }});
post请求
demobean requestBean = new demobean(); requestBean.key1 = "KEY1"; requestBean.key2 = "KEY2"; requestBean.key3 = "KEY3"; requestBean.key4 = "KEY4"; Call<BaseRequest> postApi = api.postApi(requestBean); postApi.enqueue(new Callback<BaseRequest>() { @Override public void onResponse(Call<BaseRequest> call, Response< BaseRequest> response) { Log.e("", ""); } @Override public void onFailure(Call<BaseRequest> call, Throwable t) { Log.e("", ""); } });
CallpostApiString = api.postApiString(requestBean); postApiString.enqueue(new Callback() { @Override public void onResponse(Callcall, Response Log.e("", ""); @Override public void onFailure(Callresponse) { call, Throwable t) { Log.e("", ""); } });*//*rx的使用*//* api.getRxApiString(params) .subscribeOn(Schedulers.newThread()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Subscriber() { @Override public void onCompleted() { } @Override public void onError(Throwable e) { } @Override public void onNext(ResponseBody responseBody) { //接收到数据的 } });
api.postRxApiString(requestBean).subscribeOn(Schedulers.newThread()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Subscriber() { @Override public void onCompleted() { } @Override public void onError(Throwable e) { } @Override public void onNext(RApiService.ResponseBean responseBody) { } });
//上传单个文件
File file = new File("/sdcard/", "xxx"); //file RequestBody requestFile = RequestBody.create(MediaType.parse("multipart/form-data"), file); //监听上传进度 CountingRequestBody countingRequestBody = new CountingRequestBody(requestFile, new CountingRequestBody.Liste @Override public void onRequestProgress(long bytesWritten, long contentLength) { tvFile.setText("上传进度:" + contentLength + ":" + bytesWritten); }}); MultipartBody.Part body = MultipartBody.Part.createFormData("file", file.getName(),countingRequestBody); Api api= new Api("主机头部分"); CallresponseBodyCall = api.uploadSimpleFile(body); responseBodyCall.enqueue(new Callback() { @Overridepublic void onResponse(Callcall, Response tv_showen.setText("上传成功"); }@Overridepublic void onFailure(Callresponse) { call, Throwable t) { tv_showen.setText(t.toString()); } });
//多文件上传
private void initData() { //保证文件按顺序上传 使用LinkedHashMap params = new LinkedHashMap<>(); File file1 = new File("/sdcard/", "xxx");final RequestBody requestBody1 = RequestBody.create(MediaType.parse("multipart/form-data"), file1); //监听上传进度 CountingRequestBody countingRequestBody1 = new CountingRequestBody(requestBody1, new CountingRequestBody.Listener() {@Overridepublic void onRequestProgress(long bytesWritten, long contentLength) { tv_showen.setText("上传进度:" + contentLength + ":" + bytesWritten); } }); params.put("file\";filename=\"" + file1.getName(), countingRequestBody1); File file2 = new File("/sdcard/", "xxx"); RequestBody requestBody2 = RequestBody.create(MediaType.parse("multipart/form-data"), file2); //监听上传进度 CountingRequestBody countingRequestBody2 = new CountingRequestBody(requestBody2, new CountingRequestBody.Listener() {@Overridepublic void onRequestProgress(long bytesWritten, long contentLength) { tv_showen.setText("上传进度:" + contentLength + ":" + bytesWritten); } }); params.put("file\";filename=\"" + file2.getName(), countingRequestBody2); Api api= new Api("主机头部分"); btnUpload.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) { CallresponseBodyCall = api.uploadMultiFiles(params); responseBodyCall.enqueue(new Callback() { @Overridepublic void onResponse(Callcall, Response tv_showen.setText("上传成功"); tv_showen.setText("上传成功"); }@Overridepublic void onFailure(Callresponse) { call, Throwable t) { } }); } }); }
就到此结束了 如果出现有问题,希望大家多多反馈 谢谢
更多相关文章
- android+django交互数据(同时上传图片与文字)
- Android入门:用HttpClient模拟HTTP的GET和POST请求
- android 网络通信(三):Retrofit 2.0 的使用
- Android(安卓)集成微信sdk 实现微信登录
- Android(安卓)开发 框架系列 OkHttp使用详解
- Android(安卓)9.0 适配
- Android(安卓)Day05-网络编程之提交数据
- android cookie 使用
- Android(安卓)源码 图形系统之请求布局