最近接触了Retrofit这个网络框架,下面记录一些Retrofit的简单使用:
首先对build.gradle(app)进行一些配置:
compile 'com.squareup.okhttp3:okhttp:3.2.0'
compile 'com.squareup.retrofit2:retrofit:2.0.0-beta4'
compile 'com.squareup.retrofit2:converter-gson:2.0.0-beta4'
compile 'com.squareup.retrofit2:adapter-rxjava:2.0.0-beta4'
然后我们需要定义一个接口,用于回调
public interface WetherInfoService {
@GET("http://v.juhe.cn/xiangji_weather/real_time_weather.php?areaid=101010100&key=384d62f725b7024281943a774ae96e5")
Call<ResponseBody> getString();
}
Retrofit使用了大量的注解,进行下面的操作的时候我们不妨先来学习一下Retrofit中的注解
方法注解,包含@GET、@POST、@PUT、@DELETE、@PATH、@HEAD、@OPTIONS、@HTTP。
标记注解,包含@FormUrlEncoded、@Multipart、@Streaming。
参数注解,包含@Query,@QueryMap、@Body、@Field,@FieldMap、@Part,@PartMap。
其他注解,@Path、@Header,@Headers、@Url
@HTTP:可以替代其他方法的任意一种
@Url:使用全路径复写baseUrl,适用于非统一baseUrl的场景。
@Streaming:用于下载大文件
@Path:URL占位符,用于替换和动态更新,相应的参数必须使用相同的字符串被@Path进行注释
@Query,@QueryMap:查询参数,用于GET查询,需要注意的是@QueryMap可以约定是否需要encode
@Body:用于POST请求体,将实例对象根据转换方式转换为对应的json字符串参数,
这个转化方式是GsonConverterFactory定义的。
@Field,@FieldMap:Post方式传递简单的键值对,
需要添加@FormUrlEncoded表示表单提交
@Part,@PartMap:用于POST文件上传
其中@Part MultipartBody.Part代表文件,@Part("key") RequestBody代表参数
@Header:header处理,不能被互相覆盖,用于修饰参数,
下面给出主Activity,主要的功能是单击按钮的时候就会向服务器发出请求然后将请求得到的数据通过textview显示,按钮1直接请求向服务器请求Gson数据,按钮2进一步将请求得到的Gson数据进行了解析~
public class MainActivity extends AppCompatActivity {
@BindView(R.id.button)
Button button;
@BindView(R.id.textView)
TextView textView;
private static final String BASE_URL = "http://v.juhe.cn/";
@BindView(R.id.button2)
Button button2;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ButterKnife.bind(this);
}
@OnClick({R.id.button,R.id.button2})
public void onClick(View view) {
switch (view.getId()){
case R.id.button:
Retrofit retrofit = new Retrofit.Builder().baseUrl(BASE_URL).build();
WetherInfoService wetherInfoService = retrofit.create(WetherInfoService.class);
Call<ResponseBody> call = wetherInfoService.getString();
call.enqueue(new Callback<ResponseBody>() {
@Override
public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
try
{
textView.setText(response.body().string());
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void onFailure(Call<ResponseBody> call, Throwable t) {
textView.setText(t.getMessage());
}
});
break;
case R.id.button2:
final Gson gson = new GsonBuilder().create();
Retrofit retrofit2 = new Retrofit.Builder()
.baseUrl(BASE_URL)
.addConverterFactory(GsonConverterFactory.create(gson))
.build();
WetherInfoService weatherInfoService = retrofit2.create(WetherInfoService.class);
Call<WeatherInfo> call2 = weatherInfoService.getweatherInfo();
call2.enqueue(new Callback<WeatherInfo>() {
@Override
public void onResponse(Call<WeatherInfo> call, Response<WeatherInfo> response) {
WeatherInfo info = response.body();
Log.i("TAG",gson.toJson(info));
textView.setText(gson.toJson(info));
}
@Override
public void onFailure(Call<WeatherInfo> call, Throwable t) {
textView.setText("error"+t.getMessage());
}
});
break;
}
}
}
下面给出接口的代码:
public interface WetherInfoService {
@GET("http://v.juhe.cn/weather/index?format=2&cityname=%E8%8B%8F%E5%B7%9E&key=fe8ef965373cd852b6f91e67fee1b079")
Call<ResponseBody> getString();
@GET("http://v.juhe.cn/weather/index?format=2&cityname=%E8%8B%8F%E5%B7%9E&key=fe8ef965373cd852b6f91e67fee1b079")
Call<WeatherInfo> getweatherInfo();
}
到这边基本上就完成一个利用retrofit2框架完成一个网络请求的简单Demo,下面我们将这个Demo写成RX格式的难过...
仔细体会一下其中的不同
第一步.我们需要引入对RXJAVA的一些依赖:
compile 'com.squareup.retrofit2:adapter-rxjava:2.0.0-beta4'
compile 'io.reactivex:rxandroid:1.1.0'
compile 'io.reactivex:rxjava:1.1.0'
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ButterKnife.bind(this);
}
@OnClick({R.id.button,R.id.button2})
public void onClick(View view)
{
switch (view.getId())
{
case R.id.button:
Retrofit retrofit = new Retrofit.Builder().baseUrl(BASE_URL).
addCallAdapterFactory(RxJavaCallAdapterFactory.create()).build();
WetherInfoService wetherInfoService = retrofit.create(WetherInfoService.class);
Subscription subscription=wetherInfoService.getString().subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread()).subscribe(new Subscriber<Response<ResponseBody>>(){
@Override
public void onCompleted() {
Log.e("TAG","成功");
}
@Override
public void onError(Throwable e) {
Log.e("TAG","有毒!");
}
@Override
public void onNext(Response<ResponseBody> response) {
try {
textView.setText(response.body().string());
} catch (IOException e) {
e.printStackTrace();
}
}
});
/* addSubscription(subscription);*/
break;
case R.id.button2:
break;
}
}
}
接口定义有有所改动:
public interface WetherInfoService {
@GET("http://v.juhe.cn/xiangji_weather/real_time_weather.php?areaid=101010100&key=3d84d62f725b7024281943a774ae96e5")
Observable<Response<ResponseBody>> getString();//使用rx格式的接口定义
}