retrofit2+rxjava的结合使用

  因为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) {

        }
        });
        }
        });

        }

就到此结束了 如果出现有问题,希望大家多多反馈 谢谢

 

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值