Retrofit学习笔记
一、什么是Retrofit框架
- Retrofit框架是Square公司出品的目前非常流行的网络请求框架、效率高、实现简单。运用注解和动态代理,极大的简化了网络请求的繁琐步奏,非常适合处理REST FUL网络请求,
特点
- 性能好、处理快、使用简单。目前安卓最为流行的HTTP Client库之一(速度上听说比volley更快)
- 使用REST API非常方便
- 支持NIO(新的IO API,可以替代标准的Java IO API)
- Retrofit默认使用OKHttp处理网络请求
- 默认使用GSON解析
Retrofit2中网络访问常用注解接口
- @GET GET网络请求方式
- @PSOT PSOT网络请求方式
- @Headers 头信息参数
- @Path 路径参数。替换url地址中"{"和"}"所包括的部分
- @Query 查询参数,将在地址url中追加类似"page=1"的字符串,形成提交给服务器端的请求参数
- @QueryMap 查询参数集合,在url地址中追加类似"type=text&count=30&page=1"的字符串
- @FormUrlEncoded 对表单域中填写内容进行编码处理,避免乱码
- @Field 指定form表单域中每个空间的name及相应的数值
- @FieldMap 表单域集合
- @Multipart Post提交分块请求,如果上传文件,必须指定Multipart
- @Part POST提交分块请求
- @Body POST提交分块请求
Retrofit2代码实现步骤
五部曲
- 1、定义一个接口(封装URL地址和数据请求)
- 2、实例化Retrofit
- 3、通过Retrofit实例创建接口服务对象
- 4、接口服务对象调用接口中方法,获得call对象
- 5、Call对象执行请求(异步、同步请求)
Retrofit2 GET网络请求中接口方法
- 1、GET请求,方法中无参数
@GET("article/list/latest?page")
Call<ResponseBody> getLatestString();
- 2、GET请求,方法中指定@Path参数和@Query参数。@Path用于替换url地址中"{"和"}"所包括的部分。@Query将在url地址中追加类似"page=1"的字符串,形成提交给服务器端的请求参数
@GET("article/list/{type}?")
Call<QiushiModel> getLatesList(@Path("type")) String type,@Query("page") int page);
- 3、GET请求,提交表单数据,方法中定义@QueryMap参数。 @QueryMap参数将在url地址中追加类似"type=text*count=308&page=1"的字符串
@GET ("MyWeb/RegServlet")
Call<ResponseBody> getKeyValuePair(@QueryMap Map<String,String> map);
- 4、GET请求,方法中无参数 但是在@Url里面定义完整URL路径,这种情况下BaseUrl会被忽略
@GET("http://img.234g.com/userup/112/12.jpg")
Call<ResponseBody> getNetWorkData();
简单使用(不使用Rx)
基地址
public final static String BASE_URL = "http://m2.qiushibaike.com/";
接口方法
@GET("article/list/latest?page=1")
Call<ResponseBody> getLatestJsonString();
创建接口的工厂
public class ServerFactory {
public static <T> T createServiceFactory(final Class<T> serverClass, String url) {
OkHttpClient.Builder builder = new OkHttpClient.Builder();
builder.connectTimeout(10, TimeUnit.SECONDS);
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(url)
.client(builder.build())
.addConverterFactory(GsonConverterFactory.create())
.build();
return retrofit.create(serverClass);
}
}
数据的请求
private void initData() {
MyServerInterface serverInterface = ServerFactory.createServiceFactory(MyServerInterface.class, Constant.BASE_URL);
Call<ResponseBody> call = serverInterface.getLatestJsonString();
call.enqueue(new Callback<ResponseBody>() {
@Override
public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
// I/yinlei: -------ThreadId------>1 证明返回来的数据是在主线程中的
Log.i("yinlei", "-------ThreadId------>" + Thread.currentThread().getId());
if (response.isSuccess()) {
String result = null;
try {
result = response.body().string();
try {
JSONObject resultObject = new JSONObject(result);
int errCode = resultObject.getInt("err");
if (errCode == 0) {
JSONArray items = resultObject.getJSONArray("items");
// Toast.makeText(MainActivity.this, items.toString(), Toast.LENGTH_SHORT).show();
for (int i = 0; i < items.length(); i++) {
PageBean.ItemsBean item = new Gson().fromJson(items.getString(i), new TypeToken<PageBean.ItemsBean>() {
}.getType());
mItemsBeen.add(item);
}
}
mTvResult.setText(result);
} catch (JSONException e) {
e.printStackTrace();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
@Override
public void onFailure(Call<ResponseBody> call, Throwable t) {
}
});
}
结果就是json字符串
http://m2.qiushibaike.com/article/list/latest?page=1(如果想看结果,可以打开这个链接)
使用RxJava+Retrofit请求数据
URL地址
public final static String USER_URL = "https://api.github.com";
接口方法
//获取个人信息
@GET("/users/JakeWharton")
Observable<User> getUserDataObservable();
返回接口的工厂类
public class ServerFactoryObserver {
public static <T> T createServiceFactory(final Class<T> serverClass, String url) {
OkHttpClient.Builder builder = new OkHttpClient.Builder();
builder.connectTimeout(10, TimeUnit.SECONDS);
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(url)
.client(builder.build())
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
.addConverterFactory(GsonConverterFactory.create())
.build();
return retrofit.create(serverClass);
}
}
数据请求
MyServerInterface serverInterface = ServerFactoryObserver.createServiceFactory(MyServerInterface.class, Constant.USER_URL);
serverInterface.getUserDataObservable()
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Subscriber<User>() {
@Override
public void onCompleted() {
mDialog.dismiss();
}
@Override
public void onError(Throwable e) {
}
@Override
public void onNext(User user) {
Log.d("UserActivity", user.toString());
updateUi(user);
}
});
小问题说明
//这个获取JackWharton大神的图片貌似有点问题 地址是获取到了,但是加载不出来
//通过网页加载url是可以获取的,这里用了一张网络图片地址,是可以正常加载的,暂时不明什么原因
String conver_url = mUser.getAvatar_url();
Picasso.with(this).load("http://pic29.nipic.com/20130508/9252150_163600489317_2.jpg").placeholder(R.mipmap.ic_launcher)
.into(mIvConver);
演示(貌似我的AS出了问题,所有的字符编码已经UTF-8了,但是提示我编码错误(之前没有的))
Github地址:
https://github.com/wuyinlei/RetrofitDemo
总结
这里只是简单的使用了retrofit,后面会对retrofit进行简单的封装,加入Rx。今天就到这了。
网友评论