Retrofit2+RxJava+Okhttp学习笔记

来源:互联网 发布:房产系统源码 编辑:程序博客网 时间:2024/05/24 03:19
刚刚上班,公司的事情不多,就决定多学习点东西,在掘金上发现去年一年最流行的网络框架则是Retrofit2+RxJava+Okhttp3,突然觉得自己Out了,于是开始了学习,对自己的学习心得给大家分享。
一看这个框架,发现自己平日里除了用了Okhttp其它两个在此之前并没有任何了解,于是我第一反应就是去学习Retrofit2关于Retrofit2的学习心得如下:
Retrofit 使用方法
1.首先第一步呢,必须得在androidMianifest.xml中请求了网络权限
<uses-permission android:name="android.permission.INTERNET" />

2.第二步,在androidStduio的app/bulid.grade中添加如下:

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.5'compile 'io.reactivex:rxandroid:1.2.0'

3.第三步,创建retrofit,和获取请求类

/** * 第一步创建okHttpClient */private static OkHttpClient getHttpClient() {    okhttp3.OkHttpClient.Builder    builder = new OkHttpClient.Builder();    builder.connectTimeout(5, TimeUnit.SECONDS);    builder.writeTimeout(5, TimeUnit.SECONDS);    builder.readTimeout(5, TimeUnit.SECONDS);    builder.cache(new Cache(MyApplation.getInstance().getExternalCacheDir(), 10 * 1024 * 1024));    builder.addInterceptor(new LoggerInterceptor("HttpUtil"));    builder.addNetworkInterceptor(getInterceptor());    HttpsUtils.SSLParams sslParams = HttpsUtils.getSslSocketFactory(null, null, null);    builder.sslSocketFactory(sslParams.sSLSocketFactory, sslParams.trustManager);    return builder.build();}/** * 第二步创建Retrofit */private static Retrofit getRetrofit() {    Retrofit retrofit = new Retrofit.Builder()            .client(getHttpClient())            .baseUrl(baseUrl)            .addConverterFactory(GsonConverterFactory.create())            .addCallAdapterFactory(RxJavaCallAdapterFactory.create()).build();    return retrofit;}
如上面代码所示的,Retrofit中有个client可以添加一个自己自定义的okhttpClient。如上。

4.第四步:创建数据请求接口类ApiRequest,这个就相对比较复杂,对于我自己的在这上面的研究。
对于这个接口的定义,废话步多数,我先举个举个例子
@Query,@QueryMap:查询参数,用于GET查询,需要注意的是@QueryMap可以约定的是否需要encode
/** * query用于get请求中拼接在baseUrl+get里面的参数后的参数 */@GET("group/users")Call<RequestBody> getGroupList(@Query("id") int groupId);//-->http:baseUrl/group/users?id=group@GET("group/users")Call<RequestBody> getNews(@QueryMap(encoded = true) Map<String,Object> options);

@Filed,@FiledMap:Post方式传递简单的键值对,需要添加@FormUrlEncoded表示提交
Content-Type:application/x.www.form.urlencoded

@FormUrlEncoded@POST("user/edit")Call<RequestBody> login(@Field("username")String username, @Field("password") String password);/*post请求*/@FormUrlEncoded@POST("{url}")Call<ResponseBody> sendPost(@Path("url") String url, @FieldMap Map<String, Object> params);
@HTTP:可以替代其他方法的任意一种
/** * method 表示请求方法,不区分大小写 * path 表示路径 * hasBody表示是否有请求体 */@HTTP(method = "get",path = "{url}",hasBody = false)Call<ResponseBody> getFirstBolg(@Path("url") String url);
@Streaming:用于下载大文件
/*下载文件*/@Streaming@GETCall<ResponseBody> downloadFile(@Url String fileUrl);
@Path:URL占位符,用于替换和动态更新,相应的参数必须使用相同的字符被@Path替换
  @GET("group/{id}/user")    Call<ResponseBody> getGroupList(@Path("id") int groupId);    //--> http://baseurl/group/groupId/users   //等同于    Call<ResponseBody> groupListUrl(@Url String url)
@Header:header处理,不能被 互相覆盖,用于修饰参数
  //动态设置Header  @GET("widget/lis")  Call<ResponseBody> getuser(@Header("Authorization") String authorization);  等同于//静态设置Header的值  @Headers("Authorization:authorization")  @GET("widget/list")  Call<RequestBody> getuser();
如上所用,定义接口方式。

5.第五步 向服务器发送请求
Retrofit retrofit = getRetrofit();ApiRequest request = retrofit.create(ApiRequest.class);Call<RequestBody> call = request.getinfo("jack");//异步call.enqueue(new Callback<RequestBody>() {    @Override    public void onResponse(Call<RequestBody> call, retrofit2.Response<RequestBody> response) {        Log.i(TAG,response.body().toString());    }    @Override    public void onFailure(Call<RequestBody> call, Throwable t) {       Log.i(TAG,t.toString());    }});// 同步call.execute();
这样就完成一个完整的框架搭建啦。
那么如果加上rxJava该怎么写呢,启示前三步差不多,从第四步开始改变
加上Rxjava那么如下:
4.第四步创建接口类写响应的请求方式以post方式举个例子:
/*post请求*/@FormUrlEncoded@POST("{url}")Observable<ResponseBody> sendPost(@Path("url") String url, @FieldMap Map<String, Object> params);
相比前面的接口定义方式,只改变了返回参数类型,这个方式比通用的请求,前面的url可以替代整个项目的任何一个post:url,后面则是通用的请求参数。
5.第五步 向服务器发送请求

/** * post请求获取数据 * @param params   请求的参数列表 * @param url      接口的url地址 * @param listener 监听回调 */public static void sendPost(Map<String, Object> params,final Type type, final String url, final HttpListener listener) {    ApiRequest request = getApiRequest();    Observable<ResponseBody> observable = request.sendPost(url,params);    observable.subscribeOn(Schedulers.io()).            observeOn(AndroidSchedulers.mainThread()).            unsubscribeOn(Schedulers.io()).            subscribe(new Subscriber<ResponseBody>() {                @Override                public void onCompleted() {                                    }                @Override                public void onError(Throwable e) {                    listener.onError(url, (String) new Gson().fromJson(e.getMessage(),new TypeToken<main.gooleplay.network.Result<String>>(){}.getType()));                }                @Override                public void onNext(ResponseBody responseBody) {                    try {                        Log.e("HttpUtil", "content :" + responseBody.string());                        listener.onSuccess(url,  new Gson().fromJson(responseBody.toString(),type));                    } catch (IOException e) {                        listener.onSuccess(url, new Gson().fromJson(e.getMessage(),new TypeToken<main.gooleplay.network.Result<String>>(){}.getType()));                        e.printStackTrace();                    }                }            });}

0 0
原创粉丝点击