因为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 Map<String, String> params);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 Map<String, RequestBody> params);还可以这样写
这里都是get请求:post同理
Call<List<demobean>> retrofits(@Path("hjc") String v1, @Path("hjc1") String v2);Observable<List<Contributor>> RxJavas(@Path("hjc") String v1, @Path("hjc1") String v2);
rxjava:
//Observable 是RxJava的关键点,其他不变
get请求:@GET("这里填除掉主机头部分后面的") Observable<demobean> getRxJavaApi(@QueryMap Map<String, String> params);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<demobean>>>() { @Override public void onCompleted() { } @Override public void onError(Throwable e) { } @Override public void onNext(BaseRequest<List<demobean>> 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<List<demo>>>call = api.contributors("square","retrofit");call.enqueue(new Callback<List<demo>>() { @Override public void onResponse(Call<List<demo>> call, Response<List<Contributor>> response) { tv_showen.setText(response.body().toString()); @Override public void onFailure(Call<List<demo>> call, Throwable t) { } } );键值对请求方法Map<String, String> params = new HashMap<>(); params.put("111", "vvv"); params.put("222", "vvv2"); Call<ResponseBody> apiString = api.getApiString(params); apiString.enqueue(new Callback<ResponseBody>() { @Override public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) { Log.e("", ""); try { Log.e("response",response.body().string()); } catch (IOException e) { e.printStackTrace(); } } @Override public void onFailure(Call<ResponseBody> call, Throwable t) { Log.e("", ""); } });post请求//上传单个文件demobean requestBean = new demobean(); requestBean.key1 = "KEY1"; requestBean.key2 = "KEY2"; requestBean.key3 = "KEY3"; requestBean.key4 = "KEY4"; Call<BaseRequest<demobean>> postApi = api.postApi(requestBean); postApi.enqueue(new Callback<BaseRequest<demobean>>() { @Override public void onResponse(Call<BaseRequest<demobean>> call, Response<BaseRequest<demobean>> response) { Log.e("", ""); } @Override public void onFailure(Call<BaseRequest<demobean>> call, Throwable t) { Log.e("", ""); } });Call<ResponseBody> postApiString = api.postApiString(requestBean); postApiString.enqueue(new Callback<ResponseBody>() { @Override public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) { Log.e("", ""); @Override public void onFailure(Call<ResponseBody> call, Throwable t) { Log.e("", ""); } }); *//*rx的使用*//* api.getRxApiString(params) .subscribeOn(Schedulers.newThread()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Subscriber<ResponseBody>() { @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<demobean>() { @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("主机头部分"); Call<ResponseBody> responseBodyCall = api.uploadSimpleFile(body); responseBodyCall.enqueue(new Callback<ResponseBody>() { @Override public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) { tv_showen.setText("上传成功"); } @Override public void onFailure(Call<ResponseBody> 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() { @Override public 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() { @Override public 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() { @Override public void onClick(View view) { Call<ResponseBody> responseBodyCall = api.uploadMultiFiles(params); responseBodyCall.enqueue(new Callback<ResponseBody>() { @Override public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) { tv_showen.setText("上传成功"); tv_showen.setText("上传成功"); } @Override public void onFailure(Call<ResponseBody> call, Throwable t) { } }); } }); }就到此结束了 如果出现有问题,希望大家多多反馈 谢谢