zoukankan      html  css  js  c++  java
  • android--------Retrofit+RxJava的使用

    Retrofit是Square公司开发的一款针对Android网络请求的一个当前很流行的网络请求库。

    http://square.github.io/retrofit/
    https://github.com/square/retrofit

    使用需引入:

     

    compile 'com.squareup.retrofit2:retrofit:2.1.0'
    compile 'com.squareup.retrofit2:adapter-rxjava:2.1.0'
    compile 'io.reactivex:rxandroid:1.0.1'
    compile 'com.squareup.retrofit2:converter-gson:2.1.0'

    Retrofit包含了多种网络请求方式,可根据参考选择。
    全路径

    @GET(URL+"?platform=android&appkey=5a379b5eed8aaae531df5f60b12100cfb6dff2c1&c=member&a=getdepartments")  
    Call<解析实体类> getInfo1();  

    @Query("key") String key用于接口键值对类型参数

     @GET("app.php")
     Call<UserInfo> getInfo2(@Query("platform") String platform, @Query("appkey") String appkey, @Query("c") String ip);

    @QueryMap  如果Query参数比较多,那么可以通过@QueryMap方式将所有的参数集成在一个Map统一传递

    @GET("app.php")
    Call<UserInfo> getInfoMap(@QueryMap Map<String,String> map);

    注意:以上GET换成POST也是一样的效果

    @Field("key") String key用于接口键值对类型参数

    @FormUrlEncoded
    @POST("app.php")
    Call<UserInfo> postField(@Field("platform") String bookId, @Field("appkey") String title,@Field("c") String content);

    @FieldMap  如果Field参数比较多,那么可以通过@FieldMap方式将所有的参数集成在一个Map统一传递

    @FormUrlEncoded
    @POST("app.php")
    Call<UserInfo> postInfoMap(@FieldMap Map<String,String> map);

    对于 Retrofit 中新的URL定义方式也是有一定要求的,版本不同有时格式也不一样,现在大多数2.0以上,@GET/POST()建议格式不要以 /开头,如:

    @POST("/app.php")

    而是:URL以 / 结尾  如:(注:全路径则不影响)

     http://www.baidu.com/

    代码:

    定义接口 IRequestService .java

    @GET(URL+"app.php?platform=android&appkey=5a379b5eed8aaae531df5f60b12100cfb6dff2c1&c=member&a=getdepartments")  
    Call<UserInfo> getInfo1();  
      
    /*@Query("apikey") String apikey 用于接口键值对类型参数*/  
    @GET("app.php")  
    Call<UserInfo> getInfo2(@Query("platform") String platform, @Query("appkey") String appkey, @Query("c") String ip, @Query("a") String tag);  
      
    /*@QueryMap  如果Query参数比较多,那么可以通过@QueryMap方式将所有的参数集成在一个Map统一传递*/  
    @GET("app.php")  
    Call<UserInfo> getInfoMap(@QueryMap Map<String,String> map);  

    使用

    Retrofit retrofit = new Retrofit.Builder() .baseUrl(urls) .addConverterFactory(GsonConverterFactory.create()) .build();
    IRequestService service = retrofit.create(IRequestService.class);
    Call<DepartmentInfo> call=service.getInfo1();
    call.enqueue(new Callback<DepartmentInfo>() { @Override
        public void onResponse(Call<DepartmentInfo> call, Response<DepartmentInfo> response) { DepartmentInfo info=response.body();
            mTextView.setText(info.getError()+"-----"+info.getData().get(0).toString());
            Toast.makeText(getApplicationContext(),info.getError(),Toast.LENGTH_LONG).show();
            Log.i("tag", info.getData().get(0).getDepartname());
            Log.i("tag", info.getData().get(1).getDepartname());
        } @Override
        public void onFailure(Call<DepartmentInfo> call, Throwable t) { } });

    Retrofit + RxJava结合使用

    和上面差不多, 只不过不再是Call对象而是Observable对象,及RxJava中的事件源。

    @GET(URL+"app.php?platform=android&appkey=5a379b5eed8aaae531df5f60b12100cfb6dff2c1&c=member&a=getdepartments")
    Observable<UserInfo> getRxjava();
    
    @POST("app.php")
    Observable<UserInfo> getUserFollowingObservable(@QueryMap Map<String,String> map);

    使用

    RxJavaCallAdapterFactory rxAdapter = RxJavaCallAdapterFactory.createWithScheduler(Schedulers.io());
    Retrofit retrofit11 = new Retrofit.Builder() 
      .baseUrl(urls) 
      .addConverterFactory(GsonConverterFactory.create())
      .addCallAdapterFactory(rxAdapter) 
      .build();
    IRxJavaService apiService = retrofit11.create(IRxJavaService.class);
    Observable<DepartmentInfo> call = apiService.getUser(Util.showMap());
    subscription = call
          .subscribeOn(Schedulers.io())
          .observeOn(AndroidSchedulers.mainThread()) 
          .subscribe(new Subscriber<DepartmentInfo>() { 
                @Override
                public void onCompleted() { }
                @Override
                public void onError(Throwable e) { } 
                @Override
                public void onNext(DepartmentInfo user) { Toast.makeText(getApplicationContext(),
                            user.getData().get(0).getDepartname(),
                            Toast.LENGTH_SHORT) .show();
                } });

    总结:

    Retrofit的使用和理解简单的梳理了一遍,希望能够帮助大家更好地理解Retrofit的使用。

     

    源码点击下载:https://github.com/DickyQie/android-api-request

  • 相关阅读:
    【有感】向香港雷锋学什么
    After NeuSoft’s Interview
    【SHELL学习】if语句
    《我是一只IT小小鸟》【1】
    MSDN微软社区 大连线下聚会 即将举行
    【毕业设计】修改用户信息
    SQL Connection
    EasyPR中文开源车牌识别系统 开发详解(1)
    EasyPR开发详解(2)车牌定位
    EasyPR开发详解(4)形态学操作、尺寸验证、旋转等操作
  • 原文地址:https://www.cnblogs.com/zhangqie/p/6368208.html
Copyright © 2011-2022 走看看