Android 初探Retrofit2.0.1(最新版)
来源:互联网 发布:天谕萌女萝莉数据 编辑:程序博客网 时间:2024/06/05 08:27
概述
看见这段开头,你应该听过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/"; @Override protected 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() { @Override public 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>() { @Override public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) { try { tv.setText(response.body().string()); } catch (IOException e) { e.printStackTrace(); } } @Override public 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();
在主线程中调用同步方法可能会造成ANR。有兴趣自己测试下,不在本文之列。
至此我们已经有了一个使用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() { @Override public 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>() { @Override public void onResponse(Call<WeatherInfo> call, Response<WeatherInfo> response) { WeatherInfo info = response.body(); Log.i(TAG,gson.toJson(info)); tv.setText(gson.toJson(info)); } @Override public 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; @Override protected 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() { @Override public 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>() { @Override public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) { try { tv.setText(response.body().string()); } catch (IOException e) { e.printStackTrace(); } } @Override public void onFailure(Call<ResponseBody> call, Throwable t) { tv.setText(t.getMessage()); } }); } }); btn2 = (Button) findViewById(R.id.btn2); btn2.setOnClickListener(new View.OnClickListener() { @Override public 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>() { @Override public void onResponse(Call<WeatherInfo> call, Response<WeatherInfo> response) { WeatherInfo info = response.body(); Log.i(TAG,gson.toJson(info)); tv.setText(gson.toJson(info)); } @Override public 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(最新版)
- Retrofit2源码初探
- Retrofit2.0初探
- 初探Okhttp3+Retrofit2+RXJava
- Retrofit2.0基本应用初探
- Android反编译工具包(最新版)
- Retrofit2 初探:入门及其使用 完全解析
- MVP结合RxJava,Retrofit2.0初探索
- Retrofit2 初探:入门及其使用 完全解析
- Android Retrofit2 简单使用
- 小白装逼:Android retrofit2+rxjava
- Android Retrofit2的使用
- android之Retrofit2.0
- Android retrofit2 详解
- Android Retrofit2使用
- Android初探(一)
- android AES加密解密(最新版)
- Android Retrofit2.0 查看log和JSON字符串(HttpLoggingInterceptor)
- LeetCode *** 299. Bulls and Cows
- memset实例(一)
- LeetCode-237:Delete Node in a Linked List (Python)
- ubuntu下Android开发环境搭建
- EventBus StickyEvent(粘性事件) 的应用场景! 不需要手动注销事件总线
- Android 初探Retrofit2.0.1(最新版)
- springMVC mybatis mysql 配置 事务不起作用的原因
- HttpServletRequest和HttpServletResponse的常用方法
- 深入浅出RxJava三--响应式的好处
- 下载原版Windows/Office
- javaWeb学习记录:数据库:事务
- AS中import module、import project
- spark shell ,在Windows上build Spark
- 我常浏览的网站和开发工具下载地址