Retrofit简单使用(小白都会了)
Posted 高、远
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Retrofit简单使用(小白都会了)相关的知识,希望对你有一定的参考价值。
文章目录
【1】Retrofit 简单使用
1.1 目的
我们使用Retrofit+OKhttp网络框架完成请求并返回数据显示。
1.2 关于API
我这里使用的是聚合数据,里面有很多免费的接口提供使用。
https://www.juhe.cn/
我这里选择天气预报进行测试。
这里请求地址需要两个参数city
和key
,city自己传入,key需要用自己的账号申请一个。
1.3Retrofit的使用
1.3.1 配置客户端的API接口WeatherService
我们的测试功能是只需要返回天气信息就行,所以比较简单,只写一个方法就可以了。返回类型是Retorfit内部封装的call类型,如何结合RxJava使用的话,这里返回类型要写成Observable类型。之后会讲到。
public interface WeatherService {
//获取天气信息
@GET("simpleWeather/query")
Call<Weather> getInformation(@Query("city") String city , @Query("key") String key );
}
1.3.2 简单封装一下获取retrofit实例和Service的工具类(单例设计模式)
使用doubleCheck创建retrofit单例对象,getService
方法返回的是传入类型的对象。
public class RetrofitUtils {
private static Retrofit retrofit;
//双重检查法获取实例对象
public static <T> T getService(Class<T> serviceClass){
if(retrofit == null){
synchronized (RetrofitUtils.class){
if(retrofit == null){
retrofit = new Retrofit.Builder()
.baseUrl("http://apis.juhe.cn")
.addConverterFactory(GsonConverterFactory.create())
.build();
}
}
}
return retrofit.create(serviceClass);
}
//私有化构造方法
private RetrofitUtils(){
}
}
1.3.3 写一个javabean接收返回的json数据
根据文档的返回值及类型
注意:这里吧result的类型写成Object类型,要不然会出错,因为他不是简单的String类型。
public class Weather {
private String reason;
private Object result;
private int error_code;
public String getReason() {
return reason;
}
public void setReason(String reason) {
this.reason = reason;
}
public Object getResult() {
return result;
}
public void setResult(Object result) {
this.result = result;
}
public int getError_code() {
return error_code;
}
public void setError_code(int error_code) {
this.error_code = error_code;
}
@Override
public String toString() {
return "Weather{" +
"reason='" + reason + '\\'' +
", result=" + result +
", error_code=" + error_code +
'}';
}
}
1.4 实现效果:
UI布局如下:
MainActivity代码:
public class MainActivity extends AppCompatActivity {
Button load ;
TextView address;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
init();
initFunc();
}
private void initFunc() {
load.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String tempAddress = address.getText().toString();
Log.e("address",tempAddress);
if(!tempAddress.equals("")){
WeatherService weatherService = RetrofitUtils.getService(WeatherService.class);
weatherService.getInformation(tempAddress,"****这里换成你申请的秘钥****").enqueue(new Callback<Weather>() {
@Override
public void onResponse(Call<Weather> call, Response<Weather> response) {
Weather weather = response.body();
Log.e("test0",weather.toString());
if (response.body().getError_code() == 0){
String message = response.body().getResult().toString();
Log.e("test1",message);
}else {
Toast.makeText(MainActivity.this,"城市输入有误!",Toast.LENGTH_LONG).show();
}
}
@Override
public void onFailure(Call<Weather> call, Throwable t) {
Toast.makeText(MainActivity.this,"网络延迟!",Toast.LENGTH_LONG).show();
t.printStackTrace();
}
});
}else {
Toast.makeText(MainActivity.this,"城市不能为空!",Toast.LENGTH_LONG).show();
}
}
});
}
private void init() {
load = findViewById(R.id.load);
address = findViewById(R.id.address);
}
}
下面这句话就发起请求:
weatherService.getInformation().enqueue();
测试结果:
可以看到成功的把请求的结果通过Log打印出来了(29度的重庆是真的凉快!)
以上是关于Retrofit简单使用(小白都会了)的主要内容,如果未能解决你的问题,请参考以下文章