日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Retrofit学习笔记

發(fā)布時間:2025/3/20 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Retrofit学习笔记 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

Retrofit學習筆記

###一、什么是Retrofit框架

  • Retrofit框架是Square公司出品的目前非常流行的網(wǎng)絡(luò)請求框架、效率高、實現(xiàn)簡單。運用注解和動態(tài)代理,極大的簡化了網(wǎng)絡(luò)請求的繁瑣步奏,非常適合處理REST FUL網(wǎng)絡(luò)請求, ####特點
  • 性能好、處理快、使用簡單。目前安卓最為流行的HTTP Client庫之一(速度上聽說比volley更快)
  • 使用REST API非常方便
  • 支持NIO(新的IO API,可以替代標準的Java IO API)
  • Retrofit默認使用OKHttp處理網(wǎng)絡(luò)請求
  • 默認使用GSON解析

###Retrofit2中網(wǎng)絡(luò)訪問常用注解接口

  • @GET GET網(wǎng)絡(luò)請求方式
  • @PSOT PSOT網(wǎng)絡(luò)請求方式
  • @Headers 頭信息參數(shù)
  • @Path 路徑參數(shù)。替換url地址中"{"和"}"所包括的部分
  • @Query 查詢參數(shù),將在地址url中追加類似"page=1"的字符串,形成提交給服務(wù)器端的請求參數(shù)
  • @QueryMap 查詢參數(shù)集合,在url地址中追加類似"type=text&count=30&page=1"的字符串
  • @FormUrlEncoded 對表單域中填寫內(nèi)容進行編碼處理,避免亂碼
  • @Field 指定form表單域中每個空間的name及相應(yīng)的數(shù)值
  • @FieldMap 表單域集合
  • @Multipart Post提交分塊請求,如果上傳文件,必須指定Multipart
  • @Part POST提交分塊請求
  • @Body POST提交分塊請求 ###Retrofit2代碼實現(xiàn)步驟 ####五部曲
  • 1、定義一個接口(封裝URL地址和數(shù)據(jù)請求)
  • 2、實例化Retrofit
  • 3、通過Retrofit實例創(chuàng)建接口服務(wù)對象
  • 4、接口服務(wù)對象調(diào)用接口中方法,獲得call對象
  • 5、Call對象執(zhí)行請求(異步、同步請求) ###Retrofit2 GET網(wǎng)絡(luò)請求中接口方法
  • 1、GET請求,方法中無參數(shù)
@GET("article/list/latest?page") Call<ResponseBody> getLatestString(); 復(fù)制代碼
  • 2、GET請求,方法中指定@Path參數(shù)和@Query參數(shù)。@Path用于替換url地址中"{"和"}"所包括的部分。@Query將在url地址中追加類似"page=1"的字符串,形成提交給服務(wù)器端的請求參數(shù)
@GET("article/list/{type}?") Call<QiushiModel> getLatesList(@Path("type")) String type,@Query("page") int page); 復(fù)制代碼
  • 3、GET請求,提交表單數(shù)據(jù),方法中定義@QueryMap參數(shù)。 @QueryMap參數(shù)將在url地址中追加類似"type=text*count=308&page=1"的字符串
@GET ("MyWeb/RegServlet") Call<ResponseBody> getKeyValuePair(@QueryMap Map<String,String> map); 復(fù)制代碼
  • 4、GET請求,方法中無參數(shù) 但是在@Url里面定義完整URL路徑,這種情況下BaseUrl會被忽略
@GET("http://img.234g.com/userup/112/12.jpg") Call<ResponseBody> getNetWorkData(); 復(fù)制代碼

###簡單使用(不使用Rx) #####基地址

public final static String BASE_URL = "http://m2.qiushibaike.com/"; 復(fù)制代碼

#####接口方法

@GET("article/list/latest?page=1")Call<ResponseBody> getLatestJsonString(); 復(fù)制代碼

#####創(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);} } 復(fù)制代碼

#####數(shù)據(jù)的請求

private void initData() {MyServerInterface serverInterface = ServerFactory.createServiceFactory(MyServerInterface.class, Constant.BASE_URL);Call<ResponseBody> call = serverInterface.getLatestJsonString();call.enqueue(new Callback<ResponseBody>() {@Overridepublic 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();}}}@Overridepublic void onFailure(Call<ResponseBody> call, Throwable t) {}});} 復(fù)制代碼

#####結(jié)果就是json字符串

http://m2.qiushibaike.com/article/list/latest?page=1(如果想看結(jié)果,可以打開這個鏈接) 復(fù)制代碼

###使用RxJava+Retrofit請求數(shù)據(jù) #####URL地址

public final static String USER_URL = "https://api.github.com"; 復(fù)制代碼

#####接口方法

//獲取個人信息@GET("/users/JakeWharton")Observable<User> getUserDataObservable(); 復(fù)制代碼

#####返回接口的工廠類

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);} } 復(fù)制代碼

#####數(shù)據(jù)請求

MyServerInterface serverInterface = ServerFactoryObserver.createServiceFactory(MyServerInterface.class, Constant.USER_URL);serverInterface.getUserDataObservable().subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Subscriber<User>() {@Overridepublic void onCompleted() {mDialog.dismiss();}@Overridepublic void onError(Throwable e) {}@Overridepublic void onNext(User user) {Log.d("UserActivity", user.toString());updateUi(user);}}); 復(fù)制代碼

#####小問題說明

//這個獲取JackWharton大神的圖片貌似有點問題 地址是獲取到了,但是加載不出來//通過網(wǎng)頁加載url是可以獲取的,這里用了一張網(wǎng)絡(luò)圖片地址,是可以正常加載的,暫時不明什么原因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); 復(fù)制代碼

#####演示(貌似我的AS出了問題,所有的字符編碼已經(jīng)UTF-8了,但是提示我編碼錯誤(之前沒有的))

###Github地址: https://github.com/wuyinlei/RetrofitDemo ###總結(jié) 這里只是簡單的使用了retrofit,后面會對retrofit進行簡單的封裝,加入Rx。今天就到這了。

總結(jié)

以上是生活随笔為你收集整理的Retrofit学习笔记的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。