Android 初探Retrofit2.0.1(最新版)
概述
看见这段开头,你应该听过Retrofit的大名但是没有真正的运用过,或者用过Retrofit1.9但是没有跟上更新的进度。无论什么原因,你都该好好了解下这篇博客。1.9和2.0.1版本差别很大。网上相关的教程很少,又因为是初探,所以本篇博客会用一个Demo说明Retrofit2.0.1的用法,
Retrofit GitHub地址:https://github.com/square/retrofit
Retrofit 项目主页:http://square.github.io/retrofit/
用一个Demo初探Retrofit
个人强烈建议先去浏览一遍上面的Retrofit 项目主页,会有助你了解Retrofit的基本用法和特性。
Demo结构概览
- 采用API Store里的天气接口,完整接口(带参数)地址:http://v.juhe.cn/weather/index?format=2&cityname=北京&key=b952ad7acbc7415f3f3c9bf274e39c45
- MainActivity,没做封装,请求相关的逻辑调用都写在这里
- bean目录,GSON解析数据所用到的类
- service目录,定义请求相关参数及返回数据格式
使用Retrofit获取String类型的数据
添加依赖 compile ‘com.squareup.retrofit2:retrofit:2.0.1’
从service目录开始
首先需要定义一个类名为WeatherInfoService的interface
public interface WeatherInfoService {@GET("http://v.juhe.cn/weather/index?format=2&cityname=北京&key=b952ad7acbc7415f3f3c9bf274e39c45")Call<ResponseBody> getString();
}
这里定义了一个名为getString()的抽象方法,由于这里没有指定返回类型,所以Call里面的泛型指定为ResponseBody。因为现在获取的是String类型的数据,所以暂时用不上Bean目录,直接进图MainActivity
MainActivity
private static final String BASE_URL = "http://v.juhe.cn/";@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);btn = (Button) findViewById(R.id.btn);tv = (TextView) findViewById(R.id.tv);btn.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {Retrofit retrofit = new Retrofit.Builder().baseUrl(BASE_URL).build();WeatherInfoService weatherInfoService = retrofit.create(WeatherInfoService.class);Call<ResponseBody> call = weatherInfoService.getString();call.enqueue(new Callback<ResponseBody>() {@Overridepublic void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {try {tv.setText(response.body().string());} catch (IOException e) {e.printStackTrace();}}@Overridepublic void onFailure(Call<ResponseBody> call, Throwable t) {tv.setText(t.getMessage());}});}});
}
乍一看有点蒙,没关系我们慢慢来。
1. 首先我们创建了一个retrofit对象,这里需要注意下BASE_URL这个参数,如果@GET方法里的URl是完整的,则不拼接参数,否则拼接URL。
2. 接着我们将WeatherInfoService当做参数传递给retrofit的create()方法,返回值是WeatherInfoService的一个对象。这部分几乎是固定的,如果想简单封装可以在这部分做点手脚。
3. 然后调用WeatherInfoService对象的getString()方法,得到一个call
4. call有两种执行方式,一种是像上文中调用call.enqueue异步执行。既然有异步,那肯定得有同步。同步方法:Response<WeatherInfo> res = call.execute(); WeatherInfo info = res.body();
4.0后不能在主线程访问网络,所以同步需要新开线程。有兴趣自己测试下,不在本文之列。
至此我们已经有了一个使用Retrofit获取String数据的方法,但是通常情况下我们的服务器会返回JSON/XML格式的数据,以JSON居多。别急,Retrofit已经为我们考虑好了这一点。
使用Retrofit获取JSON类型的数据
添加依赖 compile ‘com.squareup.retrofit2:converter-gson:2.0.0-beta4’
这里使用GSON解析数据,当然你也可以换做其他的。支持列表如下
Gson: com.squareup.retrofit2:converter-gson Jackson:
com.squareup.retrofit2:converter-jackson Moshi:
com.squareup.retrofit2:converter-moshi Protobuf:
com.squareup.retrofit2:converter-protobuf Wire:
com.squareup.retrofit2:converter-wire Simple XML:
com.squareup.retrofit2:converter-simplexml
还是那个service
public interface WeatherInfoService {@GET("http://v.juhe.cn/weather/index?format=2&cityname=北京&key=b952ad7acbc7415f3f3c9bf274e39c45")Call<ResponseBody> getString();@GET("http://v.juhe.cn/weather/index?format=2&cityname=北京&key=b952ad7acbc7415f3f3c9bf274e39c45")Call<WeatherInfo> getWeatherInfo();}
同样的WeatherInfoService,方法名改为getWeatherInfo,指定返回Call中的泛型为WeatherInfo,下面简单展示下WeatherInfo这个Bean
等了好久的JavaBean
由于Bean有点多,而且都是GSON解析时对应的数据,都是getter/setter故这里只展示两个作为参考。
public class WeatherInfo {private String resultcode;private String reason;private Result result;private String error_code;...
}public class Result {private Sk sk;private Today today;private List<Future> future;...
}
对比接口 返回的数据,相信应该很容易理解,不再赘述。
还是那个MainActivity
btn2.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {final Gson gson = new GsonBuilder().create();Retrofit retrofit = new Retrofit.Builder().baseUrl(BASE_URL).addConverterFactory(GsonConverterFactory.create(gson)).build();WeatherInfoService weatherInfoService = retrofit.create(WeatherInfoService.class);Call<WeatherInfo> call= weatherInfoService.getWeatherInfo();call.enqueue(new Callback<WeatherInfo>() {@Overridepublic void onResponse(Call<WeatherInfo> call, Response<WeatherInfo> response) {WeatherInfo info = response.body();Log.i(TAG,gson.toJson(info));tv.setText(gson.toJson(info));}@Overridepublic void onFailure(Call<WeatherInfo> call, Throwable t) {tv.setText("error"+t.getMessage());}});}});
细心的同学会注意到创建Retrofit对象的时候多了一行代码.addConverterFactory(GsonConverterFactory.create(gson))
和想象中一样添加了GSON解析器。不过是两行代码的事情,居然就可以直接返回GSON解析后的对象了。Retrofit确实方便,而且可拓展性杠杠的。
请求带参数
只需修改WeatherInfoService中的方法,完整的WeatherInfoService代码如下
package com.dyk.retrofit2.service;import com.dyk.retrofit2.bean.WeatherInfo;import okhttp3.ResponseBody;
import retrofit2.Call;
import retrofit2.http.GET;
import retrofit2.http.Query;/*** Created by dyk on 2016/4/9.*/
public interface WeatherInfoService {@GET("http://v.juhe.cn/weather/index?format=2&cityname=北京&key=b952ad7acbc7415f3f3c9bf274e39c45")Call<ResponseBody> getString();@GET("/weather/index?/")Call<WeatherInfo> getWeatherInfo(@Query("format") String format, @Query("cityname") String cityname, @Query("key") String key);@GET("http://v.juhe.cn/weather/index?format=2&cityname=北京&key=b952ad7acbc7415f3f3c9bf274e39c45")Call<WeatherInfo> getWeatherInfo();}
MainActivity中调用的时候自然要传入相应的参数,MainActivity全部代码如下
package com.dyk.retrofit2;import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;import com.dyk.retrofit2.bean.WeatherInfo;
import com.dyk.retrofit2.service.WeatherInfoService;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;import java.io.IOException;import okhttp3.ResponseBody;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
import retrofit2.Retrofit;
import retrofit2.converter.gson.GsonConverterFactory;public class MainActivity extends Activity {private static final String TAG = "retrofit2";private static final String BASE_URL = "http://v.juhe.cn/";private static final String FORMAT = "2";private static final String CITYNAME = "北京";private static final String KEY = "b952ad7acbc7415f3f3c9bf274e39c45";private Button btn;private Button btn2;private TextView tv;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);btn = (Button) findViewById(R.id.btn);tv = (TextView) findViewById(R.id.tv);btn.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {Retrofit retrofit = new Retrofit.Builder().baseUrl(BASE_URL).build();WeatherInfoService weatherInfoService = retrofit.create(WeatherInfoService.class);Call<ResponseBody> call = weatherInfoService.getString();call.enqueue(new Callback<ResponseBody>() {@Overridepublic void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {try {tv.setText(response.body().string());} catch (IOException e) {e.printStackTrace();}}@Overridepublic void onFailure(Call<ResponseBody> call, Throwable t) {tv.setText(t.getMessage());}});}});btn2 = (Button) findViewById(R.id.btn2);btn2.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {final Gson gson = new GsonBuilder().create();Retrofit retrofit = new Retrofit.Builder().baseUrl(BASE_URL).addConverterFactory(GsonConverterFactory.create(gson)).build();WeatherInfoService weatherInfoService = retrofit.create(WeatherInfoService.class);Call<WeatherInfo> call= weatherInfoService.getWeatherInfo(FORMAT, CITYNAME, KEY);call.enqueue(new Callback<WeatherInfo>() {@Overridepublic void onResponse(Call<WeatherInfo> call, Response<WeatherInfo> response) {WeatherInfo info = response.body();Log.i(TAG,gson.toJson(info));tv.setText(gson.toJson(info));}@Overridepublic void onFailure(Call<WeatherInfo> call, Throwable t) {tv.setText("error"+t.getMessage());}});}});}
}
结束语
很早就有闻Retrofit大名,终究没能一见。周末没事找Retrofit练练手,顺便学点新东西,结果网上极少有2.0.1版本(目前最新版)的教程。写完Demo后分享给大家,由于第一次接触Retrofit2.0.1,深度可能不是很够,但一定是最新的。后续还会继续深入了解Retrofit,希望大家能够关注。
Android 初探Retrofit2.0.1(最新版)相关推荐
- Android基于Retrofit2.0 +RxJava 封装的超好用的RetrofitClient工具类(六)
csdn :码小白 原文地址: http://blog.csdn.net/sk719887916/article/details/51958010 RetrofitClient 基于Retrofit2 ...
- Android使用Retrofit2.0和RxJava2.0处理网络请求
首先使用SpringBoot创建一个简单的SpringMVC工程. @RestController public class RetrofitController {@RequestMapping(& ...
- android studio 3.0新功能介绍
谷歌2017发布会更新了挺多内容的,而且也发布了AndroidStudio3.0预览版,一些功能先睹为快.(英语一般,有些翻译不太好) 下载地址 https://developer.android.g ...
- android中mvp封装,android-简单快速封装MVP+Retrofit2.0+Rxjava框架
1.概述 对于MVP(Model View Presenter)大多数做开发的人都能说出一二,或者看到网上的对mvp的解释,对其意都有大概的了解,但让你真正写一套mvp框架,是不是发现无从下手? 曾几 ...
- Android中RxJava+Retrofit2.0+MVP模式的整合
版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/u010046908/article/details/50781360 转载请标明出处:http:// ...
- Android 网络框架 Retrofit2.0介绍、使用和封装
前言 时至今日,Android的网络框架不再像之前那么到处都是,随着Google把 HttpClient直接删掉,似乎意味着Android越来越成熟.网络框架中的佼佼者Volley也不再那么光鲜,取而 ...
- Android:这是一份非常详细的MVP+Rxjava2.0+Retrofit2.0相结合举例RecyclerView的实战篇章
MVP+Rxjava2.0+Retrofit2.0现在是非常火的组合 MVP相信大家已经在各大网站和各大佬的文章中已经了解很多理论的理解了 MVP其实就是M层请求数据 在P层里进行M层和V层的交互 V ...
- Android 基于ijkplayer+Rxjava+Rxandroid+Retrofit2.0+MVP+Material Design的android万能播放器aaa
MDPlayer万能播放器 MDPlayer,基于ijkplayer+Rxjava+Rxandroid+Retrofit2.0+MVP+Material Design的android万能播放器,可以播 ...
- 基于ijkplayer+Rxjava+Rxandroid+Retrofit2.0+MVP+Material Design的android万能播放器
MDPlayer万能播放器 MDPlayer,基于ijkplayer+Rxjava+Rxandroid+Retrofit2.0+MVP+Material Design的android万能播放器,可以播 ...
最新文章
- a元素生成多个a的问题,元素标签结尾影响
- WebService大讲堂之Axis2(3):使用services.xml文件发布WebService
- hot编码 字符one_用 PyTorch 实现基于字符的循环神经网络 | Linux 中国
- PHP realpath() 函数
- 远程ykvm 插件移值java_远程管理KVM,命令行控制KVM,console连接,透传
- httpd 中常见的状态码
- python row column_将rowcolumnvalue数据转换为数组numpy
- 企业数据仓库总线架构、总线矩阵笔记 (第三篇)
- 联想拯救者y7000怎么配置Java环境_联想拯救者Y7000装win7详细教程(包含BIOS设置和新USB驱动)...
- 机动车尾气污染物分析仪的原理
- 启用计算机上的无线,如何使用命令提示符打开或关闭计算机上的wifi
- HTML5实现音频和视频嵌入,如何利用HTML5实现音频和视频嵌入的方法
- 第22章:针对Cloze Tests基于Attention机制的的MRC领域开山之作:Teaching Machines to Read and Comprehend架构设计及完整源码实现
- 选择排序之简单选择排序
- 信捷PLC 批量传送位 MOV DMOV QMOV
- vscode点击ctrl+c 光标变粗,且复制粘贴不了
- Python数据特征分析1-分布分析(极差,频率直方图等)
- linux网络入侵命令,如何使用netstat命令验证DDOS入侵
- 论文大致思路(不断更新)
- Linux(CentOS下)更改终端命令行颜色及网络配置
热门文章
- [转]云计算:SaaS、PaaS、IaaS、CaaS
- Linux中expect命令实现交互,修改VNCPASSWD
- 大哥你需求里说只要工作流引擎组件,怎么真正需要的东西这么.悲剧了,客户需求无止境...
- 动态规划-最长上升子序列(LIS)
- ortp流媒体协议 [1]
- 360私有云平台-HULK 5岁啦~
- SpringMvc 03 非注解形式下的映射器与适配器
- 列表解析python_基于Python列表解析(列表推导式)
- 读书日记 莫雨 《一个程序员的奋斗史》Java 面试 感悟 程序员
- Golang中各种永远阻塞的方法