android网络请求框架汇总
網絡
使用網絡庫不要忘記添加網絡權限
2.1網絡_Volley
·?簡介:
Volley的中文翻譯為“齊射、并發”,是在2013年的Google大會上發布的一款Android平臺網絡通信庫,具有網絡請求的處理、小圖片的異步加載和緩存等功能,能夠幫助Android APP 更方便地執行網絡操作,而且更快速高效。
在Google IO的演講上,其配圖是一幅發射火弓箭的圖,有點類似流星。這表示,Volley特別適合數據量不大但是通信頻繁的場景。見下圖:
https://android.googlesource.com/platform/frameworks/volley/
https://github.com/mcxiaoke/android-volley
網絡資料參考:http://www.dengzhr.com/others/mobile/android/762
·?特點:
o?通信更快,更簡單
o?支持網絡請求的排序,優先級處理
o?支持網絡請求的緩存
o?多級別的取消請求
o?擴展性強(可以自己進行相關的封裝,比如說請求失敗重試機制等)
·?配置依賴:
0.?compile'com.mcxiaoke.volley:library:1.0.19'
?
·?使用步驟:
1.?創建RequestQueue
1.??requestQueue=?Volley.newRequestQueue(this);
2.?創建Request對象
1.?//StringRequest響應的主體為字符串
2.?//JsonArrayRequest發送和接收JSON數組
3.?//JsonObjectRequest發送和接收JSON對象
4.?//ImageRequest發送和接收Image
5.?//如StringRequest
6.?//這里有兩個構造方法,一個是有method參數,一個是沒有method參數的,那么沒有method參數的默認為GET method
7.?StringRequest(int?method,?String?url,?Listener<String>?listener,?ErrorListener?errorListener)???
8.?StringRequest(String?url,?Listener<String>?listener,?ErrorListener?errorListener)
?
3.?添加Request到RequestQueue
·?注意事項:
o?如果自己編譯Volley的話,compileSdkVersion需要<=22,這是因為在Android6.0中Google移除了httpClient相關的API
o?Volley僅適合用于通信頻繁數據量小的網絡操作
o?大數據量的網絡操作并不適合Volley
·?工作原理圖
·?使用步驟:
0.?創建RequestQueue
1.?創建Request對象
2.?添加Request對象到RequestQueue中
2.2網絡_Okhttp
·?主頁:?https://github.com/square/okhttp
·?OkHttp是一個高效的Http客戶端,有如下的特點::
o?支持HTTP/2 和 SPDY
o?默認支持 GZIP 降低傳輸內容的大小
o?支持網絡請求的緩存
o?當網絡出現問題時,自動重試一個主機的多個IP 地址
·?配置: 添加依賴 compile 'com.squareup.okhttp3:okhttp:3.2.0'
·?使用步驟:
0.?創建OkHttpClient對象
1.?創建Request對象
2.?添加Request對象到OkHttpClient對象中并執行請求.示例代碼:
?
1.??OkHttpClient?okHttpClient=?new?OkHttpClient();
?
-------Get 請求---------
2.?//Get請求方式 ?
3.?//默認情況下,Request就是是使用Get請求
4.?Request?requestGet=new?Request.Builder()
5.?????????????????.url(URL_GET)
6.?????????????????.build();
?
7.??//默認情況下,Request就是是使用Get請求方式
8.?????????Request?requestGet=new?Request.Builder()
9.?????????????????.url(URL_GET)
10.?????????????????.build();
11.?????????//生成Call進行同步或者異步的調用
12.?????????Call?call=?okHttpClient.newCall(requestGet);
13.?????????//同步調用
14.?// ???????Response response = call.execute();
15.?????????//異步調用
16.?????????call.enqueue(new?Callback()?{
17.?????????????@Override
18.?????????????public?void?onFailure(Call?call,?IOException?e)?{
19.?????????????????//請求失敗的時候執行
20.?????????????}
21.?
22.?????????????@Override
23.?????????????public?void?onResponse(Call?call,?Response?response)?throws?IOException?{
24.?????????????????//網絡請求成功響應
25.?????????????}
26.?????????});
?
------Post 請求---------
27.?????RequestBody?body=?new?FormBody.Builder()//請求體
28.?????????????.add("phone",?"13812345678")//構造請求的參數
29.?????????????.add("key",?"daf8fa858c330b22e342c882bcbac622")//構造請求的參數
30.?????????????.build();
31.?
32.?????Request?post_request=?new?Request.Builder()
33.?????????????.url(URL_POST)//指定請求的地址
34.?????????????.post(body)//指定請求的方式為POST
35.?????????????.build();
36.?????client.newCall(post_request).enqueue(new?Callback()?{
37.?????????@Override
38.?????????public?void?onFailure(Call?call,?IOException?e)?{
39.?????????????//請求失敗的處理
40.?????????}
41.?
42.?????????@Override
43.?????????public?void?onResponse(Call?call,?Response?response)?throws?IOException?{???//請求成功的處理
44.?????????????ResponseBody?body=?response.body();
45.?????????????String?string=?body.string();//把返回的結果轉換為String類型
46.?????????????// body.bytes();//把返回的結果轉換為byte數組
47.?????????????// body.byteStream();//把返回的結果轉換為流
48.?????????}
49.?????});
?
·?因為原生OkHttp的使用比較復雜,有一個包裝過的工具項目okhttp-utils使用非常簡單
o?添加依賴:?
1.?compile'com.zhy:okhttputils:2.3.8'
?
o?工具類簡介:https://github.com/hongyangAndroid/okhttp-utils
代碼寫起來很簡單,如下:
2.??OkHttpUtils
3.?????????????????.get()//如果是Post請求,用.post()
4.?????????????????.url(URL)
5.?????????????????.addParams("key","value")
6.?????????????????.build()
7.?????????????????.execute(new?StringCallback()?{
8.?????????????????????@Override
9.?????????????????????public?void?onError(Call?call,?Exception?e)?{
10.?????????????????????????//可以直接在這里進行UI的操作
11.?????????????????????????//網絡訪問錯誤
12.?????????????????????}
13.?
14.?????????????????????@Override
15.?????????????????????public?void?onResponse(String?response)?{
16.?????????????????????????//可以直接在這里進行UI的操作
17.?????????????????????????//網絡正常邏輯
18.?????????????????????}
19.?????????????????});
?
2.3網絡_Retrofit
·?主頁:?https://github.com/square/retrofit
·?功能:
o?效率非常高
o?可以直接將結果轉換稱Java類
o?可以配合RxJava一起使用
·?配置:
o?添加Retrofit依賴: compile 'com.squareup.retrofit2:retrofit:2.0.2'
o?添加數據解析依賴,根據實際情況進行選擇
§?Gson : com.squareup.retrofit2:converter-gson:2.0.2
§?Jackson : com.squareup.retrofit2:converter-jackson:2.0.2
§?Moshi : com.squareup.retrofit2:converter-moshi:2.0.2
§?Protobuf : com.squareup.retrofit2:converter-protobuf:2.0.2
§?Wire : com.squareup.retrofit2:converter-wire:2.0.2
§?Simple XML : com.squareup.retrofit2:converter-simplexml:2.0.2
·?使用步驟:
0.?創建JsonBean(可以用工具生成)
1.?把Http Api 轉化為 java interface.
0.??/**
1.??????*對應Http接口的Java Interface類
2.??????*/
3.?????interface?HttpApi?{
4.?
5.?????????//網絡請求方式,請求Url
6.?????????@GET("home")
7.?????????Call<HomeResponse>?getHomeData();
8.?
9.?????????/*GET有參數請求:
10.?????????????1、可以在url后面直接進行參數拼接,比如 ???@GET("home?key=value&key2=value2")
11.?????????????2、可以用@Query進行參數設置,可以有多個
12.?????????????3、可以用@QueryMap進行參數設置用Map集合進行參數
13.?????????????*/
14.?????????@GET("home")
15.?????????Call<HomeResponse>?getHomeData(@Query("key1")?String?value1,?@Query("key2")?String?value2);
16.?
17.?????????@GET("home")
18.?????????Call<HomeResponse>?getHomeData(@QueryMap?Map<String,?String>?params);
19.?
20.?
21.?????????/*POST有參數請求:
22.??????????1、可以用@Field進行參數設置,可以有多個
23.??????????2、可以用@FieldMap進行參數設置用Map集合進行參數
24.??????????*/
25.?????????@FormUrlEncoded
26.?????????@POST("search")
27.?????????Call<SearchResponse>?search(
28.?????????????????@Field("keyword")?String?keyword,
29.?????????????????@Field("page")?String?page,
30.?????????????????@Field("pageNum")?String?pageNum,
31.?????????????????@Field("orderby")?String?orderby
32.?????????);
33.?
34.?????????@FormUrlEncoded
35.?????????@POST("search")
36.?????????Call<SearchResponse>?search(
37.?????????????????@FieldMap?Map<String,?String>?params
38.?????????);
39.?
40.?
41.?????}
?
?
§?
0.?創建Retrofit對象,并發起請求.示例代碼:
0.???//3.1創建Retrofit實例,進行接口實現
1.?????????retrofit=?new?Retrofit
2.?????????????????.Builder()
3.?????????????????.baseUrl(baseUrl)
4.?????????????????.addConverterFactory(GsonConverterFactory.create())
5.?????????????????.build();
6.?????????//3.2實例化接口類
7.?????????HomeApi?homeApi=?retrofit.create(HomeApi.class);
8.?????????//3.3調用接口的方法得到Call
9.?????????Call<HomeResponse>?homeResponseCall=?homeApi.getHomeData();
10.?????????//3.4執行數據的請求操作,可以用同步或者是異步的操作
11.?????????//3.4.1同步操作,耗時操作需要在線程中執行
12.?????????/*try {
13.?????????????Response<HomeResponse> homeResponseResponse = homeResponseCall.execute();
14.?????????????HomeResponse homeResponse = homeResponseResponse.body();
15.?
16.?????????} catch (IOException e) {
17.?????????????e.printStackTrace();
18.?????????}*/
19.?
20.?????????//3.4.2異步的操作,與okhttp的異步執行不同的是,可以在回掉的方法中進行UI的控制操作
21.?????????homeResponseCall.enqueue(new?Callback<HomeResponse>()?{
22.?????????????@Override
23.?????????????public?void?onResponse(Call<HomeResponse>?call,?Response<HomeResponse>?response)?{
24.?????????????????HomeResponse?homeResponse=?response.body();
25.?????????????????textView.setText(homeResponse.toString());
26.?????????????????textView.setTextColor(Color.GREEN);
27.?????????????}
28.?
29.?????????????@Override
30.?????????????public?void?onFailure(Call<HomeResponse>?call,?Throwable?t)?{
31.?????????????????textView.setText(t.getMessage());
32.?????????????????textView.setTextColor(Color.RED);
33.?????????????}
34.?????????});
?
·?常用注解:
o?請求方法:@GET / @POST / @PUT / @DELETE / @HEAD
o?URL處理
1、拼接注意,建議baseUrl用“/”結尾,接口中url不用"/"開頭
例子:baseUrl=http://10.0.2.2:8080/market/? ??? ? url=home
錯誤案例
0.?案例一:
1.?baseUrl=http://10.0.2.2:8080/market ???????url=home
2.?--->http://10.0.2.2:8080/home
3.?分析:默認用最后一個斜線去拼接
4.?
5.?案例二:
6.?baseUrl=http://10.0.2.2:8080/market ???????url=/home
7.?--->http://10.0.2.2:8080/home
8.?分析:url中開始的斜線代表主機地址http://10.0.2.2:8080
?
2、注解:
§?@Path - 替換參數
1.?@GET("{path1}/{path2}")//注意:如果路徑用“/”分割,就需要使用多個參數表示
2.?public?Call<ResponseData>?groupList(@Path("path1")?String?path1,@Path("path2")?String?path2);
§?@Query - 添加查詢參數,在GET請求中使用
3.??@GET("home")
4.??Call<HomeResponse>?getHomeData(@Query("key1")?String?value1,?@Query("key2")?String?value2);
?
§?@QueryMap - 如果有多個查詢參數,把它們放在Map中,在GET請求中使用
5.??@GET("home")
6.??Call<HomeResponse>?getHomeData(@QueryMap?Map<String,?String>?params);
?
o?
§?@Field單個字段,@FieldMap多個字段,把它們放在Map中,在Post請求中使用
@FormUrlEncoded 編碼控制 與Post請求結合使用,不能缺少。
7.??@FormUrlEncoded
8.??@POST("search")
9.??Call<SearchResponse>?search(
10.??????????@Field("keyword")?String?keyword,
11.??????????@Field("page")?String?page,
12.??????????@Field("pageNum")?String?pageNum,
13.??????????@Field("orderby")?String?orderby
14.??);
15.??@FormUrlEncoded
16.??@POST("search")
17.??Call<SearchResponse>?search(
18.??????????@FieldMap?Map<String,?String>?params
19.??);
?
拓展:Retrofit是okhttp進化而來的,那么也是支持返回ResponseBody類型的,我們也可以直接使用返回數據類型ResponseBody來進行格式化字符串的獲取。
20.?//接口中的方法
21.?@GET("home")
22.?Call<ResponseBody>?getHomeDataStr();
?
23.?
24.???//直接獲取json字符串
25.?????????retrofit.create(HttpApi.class)
26.?????????????????.getHomeDataStr()
27.?????????????????.enqueue(new?Callback<ResponseBody>()?{
28.?????????????????????@Override
29.?????????????????????public?void?onResponse(Call<ResponseBody>?call,?Response<ResponseBody>?response)?{
30.?????????????????????????String?resultStr=null;
31.?????????????????????????if?(response.isSuccessful())?{
32.?????????????????????????????ResponseBody?body=?response.body();
33.?????????????????????????????try?{
34.?????????????????????????????????resultStr=?body.string();
35.?????????????????????????????}?catch?(IOException?e)?{
36.?????????????????????????????????e.printStackTrace();
37.?????????????????????????????}
38.?????????????????????????}
39.?????????????????????}
40.?
41.?????????????????????@Override
42.?????????????????????public?void?onFailure(Call<ResponseBody>?call,?Throwable?t)?{
43.?
44.?????????????????????}
45.?????????????????});
?
?
·?優點:?
·?
?
總結
以上是生活随笔為你收集整理的android网络请求框架汇总的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: c语言 随机种子 monte carlo
- 下一篇: Cannot lock Java com