Retrofit學(xué)習(xí)筆記
一、什么是Retrofit框架
- Retrofit框架是Square公司出品的目前非常流行的網(wǎng)絡(luò)請(qǐng)求框架檩帐、效率高厚骗、實(shí)現(xiàn)簡(jiǎn)單。運(yùn)用注解和動(dòng)態(tài)代理,極大的簡(jiǎn)化了網(wǎng)絡(luò)請(qǐng)求的繁瑣步奏蒋失,非常適合處理REST FUL網(wǎng)絡(luò)請(qǐng)求返帕,
特點(diǎn)
- 性能好、處理快篙挽、使用簡(jiǎn)單荆萤。目前安卓最為流行的HTTP Client庫(kù)之一(速度上聽說比volley更快)
- 使用REST API非常方便
- 支持NIO(新的IO API,可以替代標(biāo)準(zhǔn)的Java IO API)
- Retrofit默認(rèn)使用OKHttp處理網(wǎng)絡(luò)請(qǐng)求
- 默認(rèn)使用GSON解析
Retrofit2中網(wǎng)絡(luò)訪問常用注解接口
- @GET GET網(wǎng)絡(luò)請(qǐng)求方式
- @PSOT PSOT網(wǎng)絡(luò)請(qǐng)求方式
- @Headers 頭信息參數(shù)
- @Path 路徑參數(shù)铣卡。替換url地址中"{"和"}"所包括的部分
- @Query 查詢參數(shù)观腊,將在地址url中追加類似"page=1"的字符串,形成提交給服務(wù)器端的請(qǐng)求參數(shù)
- @QueryMap 查詢參數(shù)集合算行,在url地址中追加類似"type=text&count=30&page=1"的字符串
- @FormUrlEncoded 對(duì)表單域中填寫內(nèi)容進(jìn)行編碼處理,避免亂碼
- @Field 指定form表單域中每個(gè)空間的name及相應(yīng)的數(shù)值
- @FieldMap 表單域集合
- @Multipart Post提交分塊請(qǐng)求苫耸,如果上傳文件州邢,必須指定Multipart
- @Part POST提交分塊請(qǐng)求
- @Body POST提交分塊請(qǐng)求
Retrofit2代碼實(shí)現(xiàn)步驟
五部曲
- 1、定義一個(gè)接口(封裝URL地址和數(shù)據(jù)請(qǐng)求)
- 2褪子、實(shí)例化Retrofit
- 3量淌、通過Retrofit實(shí)例創(chuàng)建接口服務(wù)對(duì)象
- 4、接口服務(wù)對(duì)象調(diào)用接口中方法嫌褪,獲得call對(duì)象
- 5呀枢、Call對(duì)象執(zhí)行請(qǐng)求(異步、同步請(qǐng)求)
Retrofit2 GET網(wǎng)絡(luò)請(qǐng)求中接口方法
- 1笼痛、GET請(qǐng)求裙秋,方法中無(wú)參數(shù)
@GET("article/list/latest?page")
Call<ResponseBody> getLatestString();
- 2、GET請(qǐng)求缨伊,方法中指定@Path參數(shù)和@Query參數(shù)摘刑。@Path用于替換url地址中"{"和"}"所包括的部分。@Query將在url地址中追加類似"page=1"的字符串刻坊,形成提交給服務(wù)器端的請(qǐng)求參數(shù)
@GET("article/list/{type}?")
Call<QiushiModel> getLatesList(@Path("type")) String type,@Query("page") int page);
- 3枷恕、GET請(qǐng)求,提交表單數(shù)據(jù)谭胚,方法中定義@QueryMap參數(shù)徐块。 @QueryMap參數(shù)將在url地址中追加類似"type=text*count=308&page=1"的字符串
@GET ("MyWeb/RegServlet")
Call<ResponseBody> getKeyValuePair(@QueryMap Map<String,String> map);
- 4、GET請(qǐng)求灾而,方法中無(wú)參數(shù) 但是在@Url里面定義完整URL路徑胡控,這種情況下BaseUrl會(huì)被忽略
@GET("http://img.234g.com/userup/112/12.jpg")
Call<ResponseBody> getNetWorkData();
簡(jiǎn)單使用(不使用Rx)
基地址
public final static String BASE_URL = "http://m2.qiushibaike.com/";
接口方法
@GET("article/list/latest?page=1")
Call<ResponseBody> getLatestJsonString();
創(chuàng)建接口的工廠
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);
}
}
數(shù)據(jù)的請(qǐng)求
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 證明返回來的數(shù)據(jù)是在主線程中的
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) {
}
});
}
結(jié)果就是json字符串
http://m2.qiushibaike.com/article/list/latest?page=1(如果想看結(jié)果,可以打開這個(gè)鏈接)
使用RxJava+Retrofit請(qǐng)求數(shù)據(jù)
URL地址
public final static String USER_URL = "https://api.github.com";
接口方法
//獲取個(gè)人信息
@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);
}
}
數(shù)據(jù)請(qǐng)求
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);
}
});
小問題說明
//這個(gè)獲取JackWharton大神的圖片貌似有點(diǎn)問題 地址是獲取到了绰疤,但是加載不出來
//通過網(wǎng)頁(yè)加載url是可以獲取的铜犬,這里用了一張網(wǎng)絡(luò)圖片地址,是可以正常加載的,暫時(shí)不明什么原因
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出了問題癣猾,所有的字符編碼已經(jīng)UTF-8了敛劝,但是提示我編碼錯(cuò)誤(之前沒有的))
Github地址:
https://github.com/wuyinlei/RetrofitDemo
總結(jié)
這里只是簡(jiǎn)單的使用了retrofit,后面會(huì)對(duì)retrofit進(jìn)行簡(jiǎn)單的封裝纷宇,加入Rx夸盟。今天就到這了。