网络通信框架Retrofit2

摘要:
网络通信框架Retrofit21概要Retrofit2的简介以及特点Retrofit2使用配置Retrofit2中常用的注解介绍Retrofit2实现http网络访问GET与POST请求同步请求和异步请求Retrofit2实现文件上传Retrofit2进行大文件下载2Retrofit2的特点及简介简介Retrofit翻新,改型,改良Retrofit是针对于Android/Java的、基于okHttp的、一种轻量级并使用注解方式和动态代理的网络请求框架,是目前比较流行的网络框架!

网络通信框架Retrofit2

1 概要
Retrofit2的简介以及特点
Retrofit2使用配置(导包,权限等)
Retrofit2中常用的注解介绍
Retrofit2实现http网络访问
GET与POST请求
同步请求和异步请求
Retrofit2实现文件上传
Retrofit2进行大文件下载

2 Retrofit2的特点及简介
简介
Retrofit翻新,改型,改良
Retrofit是针对于Android/Java的、基于okHttp的、一种轻量级并使用注解方式和动态代理的网络请求框架,是目前比较流行的网络框架!
Retrofit是square公司开源系列的精品之一,简单好用,效率高,基于REST的架构风格,本框架的主要开发人Jake Wharton
REST Representational State Transfer简称REST,表述性状态转移传递
一种软件架构的设计风格,针对网络应用的设计和开发方式
Retrofit让开发者面向接口去请求服务,使用注解和代理去发起真正的请求,让开发者更快速的开发应用,省掉一些复杂的逻辑处理
你不用担心android6.0不支持httpclient方式的请求,你也不用引入gson去转换数据与对象,Retrofit都已经完美实现

特点
性能好,处理快,使用简单,目前安卓中使用比较的流行网络请求跨框架之一.(速度上比volley更快!)
支持NIO;(新的IOapi,可以替代标准的java IO API)
使用注解方式,大大简化了我们的URL拼写形式,而且注解含义一目了然,简单易懂
支持同步和异步执行,使得请求变得异常简单,只要调用enqueue/execute即可完成
请求的方法参数注解都可以定制
默认是使用OKHttp处理网络请求的
默认使用Gson来进行数据解析的
相关资料的网址
retrofit官网:
http://square.github.io/retrofit/
github地址:
https://github.com/square/retrofit

3 Retrofit2的使用配置

3.1 modle下build.gradle配置添加如下依赖后进行同步
dependencies {
compile 'com.squareup.retrofit2:converter-gson:2.0.2'//
compile 'com.squareup.retrofit2:retrofit:2.3.0'
compile 'com.squareup.okhttp3:okhttp:3.8.1'
}
同步后External Libraries中会增加:
retrofit-2.3.0
okhttp-3.8.0
okio-1.13.0
gson-2.6.1
converer-gson-2.0.2
3.2 AndroidManifest.xml添加权限
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>

4 Retrofit2常用注解
请求方法类
4.1 @GET
GET网络请求方式
4.2 @PSOT
POST网络请求方式

@PUT,@DELETE,@PATCH,@HEAD,@OPTIONS,@HTTP
不常用请求方式.
参数类
4.3 @Headers
头信息参数
4.4 @Path
路径参数,用于替换url路径中的变量字符替换,也就是url中的{*}中的*部分
(@Path主要用于Get请求)
例如接口:子连接地址中/wages/{wageId}/detail
替换部分:{wageId}中的wageId.

4.5 @Query
形成单个查询参数,将接口url中追加类似于"page=1"的字符串,形成提交给服务器端的参数.
(主要用于Get请求数据,用于拼接在拼接在url路径后面的查询参数,一个@Query相当于拼接一个参数,多个参数中间用,隔开)
4.5.1,无参数
例如接口:
http://www.weather.com.cn/data/sk/101010100.html
使用注解:
@GET("data/sk/101010100.html")
Call <Weather> getWeather();
4.5.2,单个参数
例如接口:
http://cache.video.iqiyi.com/jp/avlist/202861101/1/?callback=jsonp9
形成提交参数的部分:
callback=jsonp9
使用注解:使用注解:
@GET("jp/avlist/202861101/1/")
Call VideoInfo getVideoData(@Query("callback") String callback);

4.5.3,多个参数
例如接口:
http://www.kuaidi100.com/query?type=yuantong&postid=500379523313"
形成提交参数的部分:
type=yuantong&postid=500379523313
使用注解:
@GET("query")
Call QueryInfo QueryInfo(@Query("type") String type,@Query("postid") String postid,);

4.6 @QueryMap
查询参数集合,将url中追加类似于"page=1&count=20"的字符串,形成提交给服务器端的参数.
(主要的效果等同于多个@Query参数拼接,主要也用于Get请求网络数据。)
例如接口:
http://www.kuaidi100.com/query?type=yuantong&postid=500379523313"
形成提交参数的部分:
type=yuantong&postid=500379523313
使用注解:
Call QueryInfo QueryInfo(@QueryMap Map<String, String> map) ;

4.7 @Url
使用此注解参数后,@GET后无需在添加任何内容.
方法中的@Url参数可以是全路径参数,也可以是子路径参数,但是baseurl必须要指定.

4.8 @Field
指定form表单中域中每个控件name以及相应数值
(@Field的用法类似于@Query,主要不同的是@Field主要用于Post请求数据。)

4.9 @FieldMap
表单域集合
(主要用于Post请求数据,@FieldMap的用法类似于@QueryMap)

4.10 @Part
Post提交分块请求
(表单字段,与 PartMap 配合,适合文件上传情况)

4.11PartMap
表单字段,与 Part 配合,适合文件上传情况;默认接受 Map<String, RequestBody> 类型,非 RequestBody 会通过 Converter 转换

4.12 @Body
(指定一个对象作为 request body)非表单请求体
@POST("users/new")
Call<User> createUser(@Body User user);
标记类:
4.13 @FormUrlEncoded
对表单域中填写的内容进行编码处理,避免乱码.
(用于post请求.)
例如:
@FormUrlEncoded
@POST(“/user/edit”)
Call updateUnableApeName(@Field(“first_name”) String first,
@Field(“last_name”) String last);
4.14 @MultiPart
Post提交分块请求,如果上传文件必须指定MultiPart
(请求体是支持文件上传的 From 表单)
4.15 @Streaming
响应体的数据用流的形式返回
(未使用该注解,默认会把数据全部载入内存,之后通过流读取内存中数据,所以返回数据较大时,需要使用该注解)

注意:
Map 用来组合复杂的参数;
Query、QueryMap 与 Field、FieldMap 功能一样,生成的数据形式一样;
Query、QueryMap 的数据体现在url上,主要用于GET请求.
Field、FieldMap 的数据是在请求体上,主要用于Post请求.

5 Retrofit2代码实现步骤(Retrofit2五部曲)
1,定义一个接口(用于存放执行网络请求的方法)
2,实例化Retrofit
3,通过Retrofit实例创建接口服务对象
4,接口服务对象调用其对应的方法,获取Call对象
5,Call对象来执行网络请求(同步或者异步请求)

6 Retrofit2发送GET请求
6.1 GET请求方法中无参数
6.2 GET请求方法指定@Path参数和@Query参数
6.3 GET请求,提交表单数据,方法中定义@QueryMap参数
6.4 GET请求,方法中无参数,但是在@Url中定义完整的Url路径,这种情况下BaseUrl会被忽略!
6.5 GET请求,指定返回结果为ResponseBody.
7 Retrofit2发送POST请求
7.1 Post请求,方法中定义@Fild参数,分别指定各个表单控件的名称
7.2 Post请求,方法中定义@FildMap参数,@FildMap集合中来指定所有控件名称
8 同步请求和异步请求
同步:调用call对象的excute(),需要开启子线程!!!
异步:调用call对象的enqueue(Callback<T> callback)方法,请求结果的回调是在主线程中进行的,这点不同于OkHttp.
9 Retrofit2进行文件上传
9.1 Post请求,方法中定义@Part参数,该参数指定file控件的名称及上传后文件的名称
上传数据类型:multipart/form-data
步骤:锁定File,创建RequestBody,创建MultipartBody.Part
9.2 Post请求,方法中定义@Body参数,向服务器中上传多个文件及其他表单域数据
9.3 Post请求,方法中定义@Part参数,向服务器中上传多个文件及其他表单域数据
9.4 Post请求,方法中定义@PartMap参数,向服务器中上传多个文件及其他表单域数据
使用此种方式变量的书写格式:
file"; filename="123.jpg
(表单控件名称";filename="保存在服务其端的文件名称)
web端:
Content-Disposition: form-data; name="file"; filename="1.txt"
10 Retrofit2进行文件下载
10.1小文件下载整体加载到内存.
10.2大文件下载需使用@Streaming注解,实现边下载边存入sd卡(存入sd卡过程也应该放在子线程中进行,否则会出现异常)

Java 注解
定义:注解(Annotation),也叫元数据。一种代码级别的说明。它是JDK1.5及以后版本引入的一个特性,与类、接口、枚举是在同一个层次。它可以声明在包、类、字段、方法、局部变量、方法参数等的前面,用来对这些元素进行说明,注释。

作用分类:
①编写文档:通过代码里标识的元数据生成文档【生成文档doc文档】
② 代码分析:通过代码里标识的元数据对代码进行分析【使用反射】
③编译检查:通过代码里标识的元数据让编译器能够实现基本的编译检查【Override】

Annotation(注解)是JDK1.5及以后版本引入的。它可以用于创建文档,跟踪代码中的依赖性,甚至执行基本编译时检查。注解是以‘@注解名’在代码中存在的,根据注解参数的个数,我们可以将注解分为:标记注解、单值注解、完整注解三类。它们都不会直接影响到程序的语义,只是作为注解(标识)存在,我们可以通过反射机制编程实现对这些元数据(用来描述数据的数据)的访问。另外,你可以在编译时选择代码里的注解是否只存在于源代码级,或者它也能在class文件、或者运行时中出现(SOURCE/CLASS/RUNTIME)。

元数据的作用
如果要对于元数据的作用进行分类,还没有明确的定义,不过我们可以根据它所起的作用,大致可分为三类:
编写文档:通过代码里标识的元数据生成文档。
代码分析:通过代码里标识的元数据对代码进行分析。
编译检查:通过代码里标识的元数据让编译器能实现基本的编译检查

代码实现:Activity

1 public class MainActivity extends AppCompatActivity implementsView.OnClickListener {
2 
3     privateTextView tv_content;
4     private String TAG = this.getClass().getSimpleName();
5     privateString itemName;
6     private String STR_TAG = TAG + "--->***";
7     protectedOkHttpClient okHttpClient;
8     protectedHandler deliveryHandler;
9 
10 @Override
11     protected voidonCreate(Bundle savedInstanceState) {
12         super.onCreate(savedInstanceState);
13 setContentView(R.layout.activity_main);
14         findViewById(R.id.btn_retrofit).setOnClickListener(this);
15         tv_content =(TextView) findViewById(R.id.tv_content);
16 
17         okHttpClient = OkHttpClientManager.getInstance(this).getOkHttpClient();
18         deliveryHandler = OkHttpClientManager.getInstance(MainActivity.this).getDeliveryHandler();
19 }
20 
21 @Override
22     public voidonClick(View v) {
23         //弹一个对话框,分类选择:
24 show();
25 
26 }
27 
28     private voidshow() {
29         //创建builder对象。
30         final AlertDialog.Builder builder = new AlertDialog.Builder(this);
31         //设置标题.
32         builder.setTitle("Retrofit2操作");
33         //设置列表内容,以及点击事件.
34         //参数:1,String数组.2,点击事件.
35         final String[] items ={
36                 "0指定无参数GET请求",
37                 "1指定@Path和@Query参数GET请求",
38                 "2指定@QueryMap参数集合GET请求",
39                 "3指定@Url参数GET请求",
40                 "4指定GET请求返回ResponseBody",
41                 "5同步GET请求",
42                 "6指定@Fild参数POST请求",
43                 "7指定@FildMap参数POST请求",
44                 "8指定@Part参数单文件上传",
45                 "9指定@Body多文件上传带参数",
46                 "10指定@Part通过多文件上传带参数",
47                 "11指定@PartMap多文件上传带参数",
48                 "12指定@Streaming大文件下载",
49 };
50         builder.setItems(items, newDialogInterface.OnClickListener() {
51 @Override
52             public void onClick(DialogInterface dialogInterface, inti) {
53                 itemName = items[i] +STR_TAG;
54                 switch(i) {
55                     case 0:
56 get0();
57                         break;
58                     case 1:
59 get1();
60                         break;
61                     case 2:
62 get2();
63                         break;
64                     case 3:
65 get3();
66                         break;
67                     case 4:
68 get4();
69                         break;
70                     case 5:
71 get5();
72                         break;
73                     case 6:
74 get6();
75                         break;
76                     case 7:
77 get7();
78                         break;
79                     case 8:
80 get8();
81                         break;
82                     case 9:
83 get9();
84                         break;
85                     case 10:
86 get10();
87                         break;
88                     case 11:
89 get11();
90                         break;
91                     case 12:
92 get12();
93                         break;
94 }
95 }
96 });
97 builder.create().show();
98 }
99 
100     private voidget11() {
101         final File file = new File(Environment.getExternalStorageDirectory(), "1.txt");
102         final File file1 = new File(Environment.getExternalStorageDirectory(), "2.png");
103         final RequestBody body =MultipartBody.create(MultipartBody.FORM, file);
104         final RequestBody body1 =MultipartBody.create(MultipartBody.FORM, file1);
105         final RequestBody body2 =RequestBody.create(MultipartBody.FORM, "zxn001");
106 
107 //body =MultipartBody.Part.createFormData("file", file.getName(), body).body();
108 //body1 =MultipartBody.Part.createFormData("file", file.getName(), body1).body();
109 //final RequestBody body2 = MultipartBody.Part.createFormData("username", "zxn001").body();
110 
111 
112         String baseUrl = "http://192.168.1.102/";
113         newRetrofit.Builder()
114 .baseUrl(baseUrl)
115 .client(okHttpClient)
116 .build()
117                 .create(NetService.class)
118                 .uploadFilesByPartMap(new HashMap<String, RequestBody>(){
119 {
120                         put("file"; filename=""+file.getName(), body);
121                         put("file"; filename=""+file1.getName(), body1);
122                         put("username",body2);
123 }
124 })
125                 .enqueue(new Callback<ResponseBody>() {
126 @Override
127                     public void onResponse(Call<ResponseBody> call, Response<ResponseBody>response) {
128                         try{
129                             showResult("onResponse"+response.body().string());
130                         } catch(IOException e) {
131 e.printStackTrace();
132 }
133 }
134 
135 @Override
136                     public void onFailure(Call<ResponseBody>call, Throwable t) {
137                         showResult("onFailure"+t.getMessage());
138 }
139 });
140 }
141 
142     private voidget12() {
143         final String baseUrl = "http://1251603248.vod2.myqcloud.com/";
144         final String downUrl = "http://1251603248.vod2.myqcloud.com/4c9adaa7vodtransgzp1251603248/30e0819d9031868223192061218/v.f40.mp4";
145         new Thread(newRunnable() {
146 @Override
147             public voidrun() {
148                 try{
149                     Response<ResponseBody> response = newRetrofit.Builder()
150 .baseUrl(baseUrl)
151 .client(okHttpClient)
152 .build()
153                             .create(NetService.class)
154 .download(downUrl)
155 .execute();
156 
157                     if(response.isSuccessful()) {
158                         deliveryHandler.post(newRunnable() {
159 @Override
160                             public voidrun() {
161                                 showResult("服务器连接成功!");
162 }
163 });
164                         boolean ok =writeDisk(response.body());
165                         Log.i(TAG, STR_TAG + "run: 下载:" +ok);
166                         if(ok) {
167                             deliveryHandler.post(newRunnable() {
168 @Override
169                                 public voidrun() {
170                                     tv_content.setText("下载完成!!");
171 }
172 });
173 }
174                     } else{
175                         deliveryHandler.post(newRunnable() {
176 @Override
177                             public voidrun() {
178                                 showResult("下载失败!");
179 }
180 });
181 }
182                 } catch(IOException e) {
183 e.printStackTrace();
184 }
185 }
186 }).start();
187 }
188 
189     private booleanwriteDisk(ResponseBody body) {
190         try{
191             File file = new File(Environment.getExternalStorageDirectory(), "1.mp4");
192             InputStream inputStream = null;
193             OutputStream outputStream = null;
194             try{
195                 byte[] fileReader = new byte[4096];
196                 long fileSize =body.contentLength();
197                 long loadSize = 0;
198 
199                 inputStream =body.byteStream();
200                 outputStream = newFileOutputStream(file);
201                 int len = -1;
202                 while ((len = inputStream.read(fileReader)) != -1) {
203                     outputStream.write(fileReader, 0, len);
204                     loadSize +=len;
205                     Log.i(TAG, STR_TAG + "已经下载: " + loadSize + "/总大小: " +fileSize);
206 }
207 outputStream.flush();
208                 return true;
209             } catch(IOException e) {
210                 return false;
211             } finally{
212                 if (inputStream != null) {
213 inputStream.close();
214 }
215                 if (outputStream != null) {
216 outputStream.close();
217 }
218 }
219         } catch(IOException e) {
220             return false;
221 }
222 }
223 
224     private voidget10() {
225         File file = new File(Environment.getExternalStorageDirectory(), "1.txt");
226         File file1 = new File(Environment.getExternalStorageDirectory(), "2.png");
227         List<MultipartBody.Part> parts = new ArrayList<>();
228         RequestBody body =MultipartBody.create(MultipartBody.FORM, file);
229         RequestBody body1 =MultipartBody.create(MultipartBody.FORM, file1);
230         MultipartBody.Part part = MultipartBody.Part.createFormData("file", file.getName(), body);
231         MultipartBody.Part part1 = MultipartBody.Part.createFormData("file", file1.getName(), body1);
232         MultipartBody.Part part2 = MultipartBody.Part.createFormData("username", "zxn001");
233 parts.add(part);
234 parts.add(part1);
235 parts.add(part2);
236 
237 //String baseUrl = "http://192.168.1.102/";
238         String baseUrl = "http://169.254.38.24/";
239         newRetrofit.Builder()
240 .baseUrl(baseUrl)
241 .client(okHttpClient)
242 .build()
243                 .create(NetService.class)
244 .uploadFilesByPart(parts)
245                 .enqueue(new Callback<ResponseBody>() {
246 @Override
247                     public void onResponse(Call<ResponseBody> call, Response<ResponseBody>response) {
248                         try{
249                             showResult("onResponse" +response.body().string());
250                         } catch(IOException e) {
251 e.printStackTrace();
252 }
253 }
254 
255 @Override
256                     public void onFailure(Call<ResponseBody>call, Throwable t) {
257                         showResult("onFailure" +t.getMessage());
258 }
259 });
260 }
261 
262     private voidget9() {
263         File file = new File(Environment.getExternalStorageDirectory(), "a.jpg");
264         File file1 = new File(Environment.getExternalStorageDirectory(), "d.jpg");
265         MultipartBody.Builder builder = newMultipartBody.Builder();
266         RequestBody body =MultipartBody.create(MultipartBody.FORM, file);
267         RequestBody body1 =MultipartBody.create(MultipartBody.FORM, file1);
268         MultipartBody multipartBody =builder
269                 .addFormDataPart("file", file.getName(), body)
270                 .addFormDataPart("file", file1.getName(), body1)
271                 .addFormDataPart("username", "zxn123")
272 .setType(MultipartBody.FORM)
273 .build();
274 
275 //String baseUrl = "http://192.168.1.102/";
276         String baseUrl = "http://169.254.38.24/";
277         newRetrofit.Builder()
278 .baseUrl(baseUrl)
279 .client(okHttpClient)
280 .build()
281                 .create(NetService.class)
282 .uploadFilesByody(multipartBody)
283                 .enqueue(new Callback<ResponseBody>() {
284 @Override
285                     public void onResponse(Call<ResponseBody> call, Response<ResponseBody>response) {
286                         try{
287                             showResult("onResponse" +response.body().string());
288                         } catch(IOException e) {
289 e.printStackTrace();
290 }
291 }
292 
293 @Override
294                     public void onFailure(Call<ResponseBody>call, Throwable t) {
295                         showResult("onFailure" +t.getMessage());
296 }
297 });
298 
299 }
300 
301     private voidget8() {
302         //指定上传文件
303         File file = new File(Environment.getExternalStorageDirectory(), "3.jpg");
304 //RequestBody body = RequestBody.create(MediaType.parse("multipart/form-data"), file);
305 
306         //封装请求体
307 //RequestBody body = RequestBody.create(MediaType.parse("application/otcet-stream"), file);
308         RequestBody body =MultipartBody.create(MultipartBody.FORM, file);
309         MultipartBody.Part part = MultipartBody.Part.createFormData("file", file.getName(), body);
310 
311 
312         //http://192.168.1.100/MyUploadServer/servlet/UpLoadFileServlet
313 //String baseUrl = "http://192.168.1.102/";
314         String baseUrl = "http://169.254.38.24/";
315 
316         newRetrofit.Builder()
317 .baseUrl(baseUrl)
318 .client(okHttpClient)
319 .build()
320                 .create(NetService.class)
321 .postUpLoadFile(part)
322                 .enqueue(new Callback<ResponseBody>() {
323 @Override
324                     public void onResponse(Call<ResponseBody> call, Response<ResponseBody>response) {
325                         try{
326                             showResult("onResponse" +response.body().string());
327                         } catch(IOException e) {
328 e.printStackTrace();
329 }
330 }
331 
332 @Override
333                     public void onFailure(Call<ResponseBody>call, Throwable t) {
334                         showResult("onFailure" +t.getMessage());
335 }
336 });
337 }
338 
339     private voidget7() {
340 //String baseUrl = "http://v5.pc.duomi.com/search-ajaxsearch-searchall?kw=liedehua&pi=1&pz=10";
341         String baseUrl = "http://v5.pc.duomi.com/";
342         newRetrofit.Builder()
343 .baseUrl(baseUrl)
344 .client(okHttpClient)
345 .build()
346                 .create(NetService.class)
347                 .getSearchByPost(new HashMap<String, String>() {
348 {
349                         put("kw", "liedehua");
350                         put("pi", "1");
351                         put("pz", "15");
352 }
353                 }).enqueue(new Callback<ResponseBody>() {
354 @Override
355             public void onResponse(Call<ResponseBody> call, Response<ResponseBody>response) {
356                 try{
357                     showResult("onResponse" +response.body().string());
358                 } catch(IOException e) {
359 e.printStackTrace();
360 }
361 }
362 
363 @Override
364             public void onFailure(Call<ResponseBody>call, Throwable t) {
365                 showResult("onFailure" +t.getMessage());
366 }
367 });
368 }
369 
370     private voidget6() {
371 //String baseUrl = "http://cache.video.iqiyi.com/jp/avlist/202861101/1/?callback=jsonp9";
372         String baseUrl = "http://cache.video.iqiyi.com/";
373         newRetrofit.Builder()
374 .baseUrl(baseUrl)
375 .client(okHttpClient)
376 .build()
377                 .create(NetService.class)
378                 .getJpByPost("jsonp9")
379                 .enqueue(new Callback<ResponseBody>() {
380 @Override
381                     public void onResponse(Call<ResponseBody> call, Response<ResponseBody>response) {
382                         try{
383                             showResult("onResponse" +response.body().string());
384                         } catch(IOException e) {
385 e.printStackTrace();
386 }
387 }
388 
389 @Override
390                     public void onFailure(Call<ResponseBody>call, Throwable t) {
391                         showResult("onFailure" +t.getMessage());
392 }
393 });
394 
395 }
396 
397     private voidget4() {
398         String baseUrl = "http://api.immedc.com/";
399         newRetrofit.Builder()
400 .baseUrl(baseUrl)
401 .client(okHttpClient)
402 .build()
403                 .create(NetService.class)
404 .getStartBannerResponseBody()
405                 .enqueue(new Callback<ResponseBody>() {
406 @Override
407                     public void onResponse(Call<ResponseBody> call, Response<ResponseBody>response) {
408                         try{
409                             showResult("onResponse" +response.body().string());
410                         } catch(IOException e) {
411 e.printStackTrace();
412 }
413 }
414 
415 @Override
416                     public void onFailure(Call<ResponseBody>call, Throwable t) {
417                         showResult("onFailure" +t.getMessage());
418 }
419 });
420 
421 }
422 
423     private voidget5() {
424         final String baseUrl = "http://www.weather.com.cn/";
425         new Thread(newRunnable() {
426 @Override
427             public voidrun() {
428                 try{
429                     final Weather weather = newRetrofit.Builder()
430 .baseUrl(baseUrl)
431 .addConverterFactory(GsonConverterFactory.create())
432 .client(okHttpClient)
433 .build()
434                             .create(NetService.class)
435 .getWeather()
436 .execute().body();
437                     MainActivity.this.runOnUiThread(newRunnable() {
438 @Override
439                         public voidrun() {
440 showResult(weather.toString());
441 }
442 });
443                 } catch(IOException e) {
444 e.printStackTrace();
445 }
446 }
447 }).start();
448 }
449 
450     private voidget3() {
451         String baseUrl = "http://www.weather.com.cn/";
452 //String url = "http://www.weather.com.cn/data/sk/101010100.html";
453         String url = "data/sk/101010100.html";
454         newRetrofit.Builder().baseUrl(baseUrl)
455 .client(okHttpClient)
456 .addConverterFactory(GsonConverterFactory.create())
457 .build()
458                 .create(NetService.class)
459 .getWeather(url)
460                 .enqueue(new Callback<Weather>() {
461 @Override
462                     public void onResponse(Call<Weather> call, Response<Weather>response) {
463                         showResult("onResponse" +response.body().toString());
464 }
465 
466 @Override
467                     public void onFailure(Call<Weather>call, Throwable t) {
468                         showResult("onFailure" +t.getMessage());
469 }
470 });
471 }
472 
473     private voidget2() {
474         String baseUrl = "http://www.kuaidi100.com/";
475         newRetrofit.Builder()
476 .baseUrl(baseUrl)
477 .client(okHttpClient)
478 .addConverterFactory(GsonConverterFactory.create())
479                 .build().create(NetService.class)
480                 .getQueryInfo(new HashMap<String, String>() {
481 {
482                         put("type", "yuantong");
483                         put("postid", "500379523313");
484 }
485                 }).enqueue(new Callback<QueryInfo>() {
486 @Override
487             public void onResponse(Call<QueryInfo> call, Response<QueryInfo>response) {
488                 showResult("onResponse" +response.body().toString());
489 }
490 
491 @Override
492             public void onFailure(Call<QueryInfo>call, Throwable t) {
493                 showResult("onResponse" +t.getMessage());
494 }
495 });
496 }
497 
498     private voidget1() {
499         String baseUrl = "http://m2.qiushibaike.com/";
500         newRetrofit.Builder().baseUrl(baseUrl)
501 .addConverterFactory(GsonConverterFactory.create())
502 .client(okHttpClient)
503 .build()
504                 .create(NetService.class)
505                 .getArticles("latest", 1)
506                 .enqueue(new Callback<QiushiModel>() {
507 @Override
508                     public void onResponse(Call<QiushiModel> call, Response<QiushiModel>response) {
509                         showResult("onResponse" +response.body().toString());
510 }
511 
512 @Override
513                     public void onFailure(Call<QiushiModel>call, Throwable t) {
514                         showResult("onFailure" +t.getMessage());
515 }
516 });
517 }
518 
519     private voidget0() {
520         String url = "http://www.weather.com.cn/";
521         Retrofit.Builder builder = newRetrofit.Builder();
522 builder.baseUrl(url)
523 .client(okHttpClient)
524 .addConverterFactory(GsonConverterFactory.create())
525                 .build().create(NetService.class).getWeather().enqueue(new Callback<Weather>() {
526 @Override
527             public void onResponse(Call<Weather> call, Response<Weather>response) {
528                 Weather body =response.body();
529 showResult(body.toString());
530 }
531 
532 @Override
533             public void onFailure(Call<Weather>call, Throwable t) {
534 showResult(t.getMessage());
535 }
536 });
537 }
538 
539     private voidshowResult(String result) {
540         String mResult = itemName +result;
541 tv_content.setText(mResult);
542         Toast.makeText(this, mResult, Toast.LENGTH_SHORT).show();
543 Log.i(TAG, mResult);
544 }
545 }

创建接口,用于存放网络请求的方法

1 public interfaceNetService {
2 
3     @GET("data/sk/101010100.html")
4     Call<Weather>getWeather();
5 
6     @GET("article/list/{type}?")
7     Call<QiushiModel> getArticles(@Path("type") String type, @Query("page") intpage);
8 
9     @GET("query")
10     Call<QueryInfo> getQueryInfo(@QueryMap Map<String, String>map);
11 
12 @GET
13     Call<Weather>getWeather(@Url String url);
14 
15     @GET("/restapi/loading/getStartBanner")
16     Call<ResponseBody>getStartBannerResponseBody();
17 
18 @FormUrlEncoded
19     @POST("jp/avlist/202861101/1/")
20     Call<ResponseBody> getJpByPost(@Field("callback") String callback);
21 
22 @FormUrlEncoded
23     @POST("search-ajaxsearch-searchall")
24     Call<ResponseBody> getSearchByPost(@FieldMap Map<String, String>map);
25 
26 @Multipart
27     @POST("MyUploadServer/servlet/UpLoadFileServlet")
28     Call<ResponseBody>postUpLoadFile(@Part() MultipartBody.Part requestBody);
29 
30     @POST("MyUploadServer/servlet/MyUploadServlet")
31     Call<ResponseBody>uploadFilesByody(@Body MultipartBody multipartBody);
32 
33 @Multipart
34     @POST("MyUploadServer/servlet/MyUploadServlet")
35     Call<ResponseBody> uploadFilesByPart(@Part()  List<MultipartBody.Part>parts);
36 
37 @Multipart
38     @POST("MyUploadServer/servlet/MyUploadServlet")
39     Call<ResponseBody> uploadFilesByPartMap(@PartMap()  Map<String, RequestBody>map);
40 
41 @Streaming
42 @GET
43     Call<ResponseBody>download(@Url String fileUrl);
44 
45 }

免责声明:文章转载自《网络通信框架Retrofit2》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇使用PL/SQL Developer连接远程数据库Hive Group By 常见错误下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

操作系统笔记-1

第一章 操作系统引论 ★计算机操作系统是方便用户、管理和控制计算机软硬件资源的系统软件(或程序集合)。 1.OS的目标:有效性、方便性、可扩充性、开放性 2.OS的作用:1) OS作为用户与计算机硬件系统之间的接口;             ★(用户使用计算机的三种方式:命令、系统调用、图标窗口) 2)OS作为计算机系统资源的管理者;           ...

java和vb进行socket通信以及java与c/c++/oc 进行socket通信时汉字字符串编码问题解决

java和vb进行socket 以及java与c/c++/oc 进行socket通信时汉字字符串编码问题解决 我遇到的是 java 编码字符集采用 UTF-8 编码字符采用2+字符 我测试的代码如下 System.out.println("UTF-8:a->" + "a".getBytes("UTF-8").length); System....

深入探讨C#中Socket一次性搞定消息发送

转载自:http://tech.chinaunix.net/a2010/0909/1101/000001101396.shtml     【IT168 技术文档】最近浏览了几篇有关Socket发送消息的文章,发现大家对Socket Send方法理解有所偏差,现将自己在开发过程中对Socket的领悟写出来,以供大家参考。   (一)架构   基于TC...

微信小程序通信录

第一步:phone.wxml中 <view bindlongtap="clickPhone">{{phoneNum}}</view> 第二步:phone.json { "navigationBarTitleText": "联系人" } 第三步:phone.wxss view{ color:blue; padding: 1...

主流RPC框架通讯协议实现原理与源码解析

主流RPC框架通讯协议实现原理与源码解析。互联网+的大环境下,用户量、数据量的急剧增长,使得单机系统不能承载更多的数据处理能力,从而催生了分布式技术的快速发展。 分布式RPC框架,已经有很多开源的高性能框架,例如Dubbo、GRpc、Spring Cloud,他们都是非常优秀的RPC框架。这个PPT主要是用来分析常见RPC框架的实现原理和源码解析,最后通...

【转】RS232/RS485/RS422 接口简介与编程

【转】RS-232/RS-485/RS-422 接口简介与编程 最近在调试两款产品时,问题都是出在了串口通信上。今天加班好不容易跟着把其中一款产品的串口接收数据的错误给调好了!回宿舍特地查了下资料,发现这篇文章对RS-232/RS-485/RS-422 的介绍还可以拿来一看。 一、什么是RS-232 接口? (1) RS-232 的历史和作用在串行通讯...