Retrofit学习笔记
生活随笔
收集整理的這篇文章主要介紹了
Retrofit学习笔记
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
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請求,方法中無參數
- 2、GET請求,方法中指定@Path參數和@Query參數。@Path用于替換url地址中"{"和"}"所包括的部分。@Query將在url地址中追加類似"page=1"的字符串,形成提交給服務器端的請求參數
- 3、GET請求,提交表單數據,方法中定義@QueryMap參數。 @QueryMap參數將在url地址中追加類似"type=text*count=308&page=1"的字符串
- 4、GET請求,方法中無參數 但是在@Url里面定義完整URL路徑,這種情況下BaseUrl會被忽略
###簡單使用(不使用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>() {@Overridepublic 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();}}}@Overridepublic 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>() {@Overridepublic void onCompleted() {mDialog.dismiss();}@Overridepublic void onError(Throwable e) {}@Overridepublic 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。今天就到這了。
總結
以上是生活随笔為你收集整理的Retrofit学习笔记的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Python_1
- 下一篇: NSString 用法总结与陷阱