前言
到这里发现自己已经还是写了一些东西了,然后发现在里面没得写过什么和网络有关的博客,于是准备一天写一篇,网络这方面的东西。现在Android这边最常用的就是retrofit+okhttp+rxjava,也是最热门的东西,然后最近就决定写一些这一系列的东西。然后今天呢先写一篇有关于Retrofit有关的吧。
名言
流水在碰到底处时才会释放活力。
Retrofit简介
Retrofit是 Square 公司开源的适用于Android与Java的网络请求库,官方的介绍非常简短。底层基于OkHttp 实现。
实例分析
这里还是从一个实例中来分析retrofit,就从聚合数据上拿新闻头条的内容吧。
先来看看效果图
要用这个东西先来导2个包吧
前2个是retorfit的包,后面我这里处理图片用的是Glide,所以还需要导一个Glide的包
compile ‘com.squareup.retrofit2:retrofit:2.0.2’
compile ‘com.squareup.retrofit2:converter-gson:2.0.2’
compile ‘com.github.bumptech.glide:glide:3.5.2
主页面的布局就是Recycleview,这里我就不再写Recycleview的代码了可以看我以前的文章
再看看结构
这个地方NewsBean是实体类(内容过多不贴出来了,可通过GsonFormat这个插件把json格式的数据装换成实体类)
NewsService是一个请求网络的接口(这里贴一下这个的代码)
//get请求
public interface NewsService {
@GET("/toutiao/index")
Call<NewsBean> getNews_G(@Query("key") String key);
//post请求
@FormUrlEncoded
@POST("/toutiao/index")
Call<NewsBean> getNews_P(@Field("key") String key);
}
这里是请求方式以及请求路径
@GET(“/toutiao/index”)
这里是请求的参数
Call getNews_G(@Query(“key”) String key);
然后给大家列出一些常用的注解
1、@Query、@QueryMap:用于Http Get请求传递参数
2、@Field:用于Post方式传递参数,需要在请求接口方法上添加@FormUrlEncoded,即以表单的方式传递参数
3、@Body:用于Post,根据转换方式将实例对象转化为对应字符串传递参数.比如Retrofit添加GsonConverterFactory则是将body转化为gson字符串进行传递
4、@Path:用于URL上占位符
5、@Part:配合@Multipart使用,一般用于文件上传
6、@Header:添加http header
7、@Headers:跟@Header作用一样,只是使用方式不一样,@Header是作为请求方法的参数传入,@Headers是以固定方式直接添加到请求方法上
初始化retrofit
String BASE_URL = "http://v.juhe.cn";
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(BASE_URL)
.addConverterFactory(GsonConverterFactory.create())
.build();
上面为前一半路径加上接口里面的请求路径我们来看看是什么样的http://v.juhe.cn/toutiao/index?key=APPKEY是不是就成了一个完整的请求路径
得到接口里面的call异步处理回调
NewsService service = retrofit.create(NewsService.class);
service.getNews_G(key).enqueue(new Callback<NewsBean>() {
@Override
public void onResponse(Call<NewsBean> call, Response<NewsBean> response) {
NewsBean newsBean = response.body();
if (newsBean.getReason().equals("成功的返回")) {
list.addAll(newsBean.getResult().getData());
if (list != null){
handler.sendEmptyMessage(1);
}
}
}
@Override
public void onFailure(Call<NewsBean> call, Throwable t) {
}
});
onResponse表示请求成功
onFailure表示请求失败
MainActivity所有的代码
public class MainActivity extends AppCompatActivity {
private RecyclerView recyclerView = null;
private MyAdapter adapter = null;
private ArrayList<NewsBean.ResultBean.DataBean> list = null;
private final String key = "你自己在聚合数据申请的key";
private Handler handler = new Handler(){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
if (msg.what == 1){
//设置数据
adapter.setList(list);
//刷新列表
adapter.notifyDataSetChanged();
}
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
list = new ArrayList<>();
setContentView(R.layout.activity_main);
getNet(key);
initView();
}
public void initView() {
recyclerView = (RecyclerView) findViewById(R.id.recycle);
RecyclerView.LayoutManager manager = new LinearLayoutManager(this);
recyclerView.setLayoutManager(manager);
adapter = new MyAdapter(this);
recyclerView.setAdapter(adapter);
}
public void getNet(String key) {
//请求的前半路径
String BASE_URL = "http://v.juhe.cn";
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(BASE_URL)
.addConverterFactory(GsonConverterFactory.create())
.build();
NewsService service = retrofit.create(NewsService.class);
service.getNews_G(key).enqueue(new Callback<NewsBean>() {
@Override
public void onResponse(Call<NewsBean> call, Response<NewsBean> response) {
NewsBean newsBean = response.body();
if (newsBean.getReason().equals("成功的返回")) {
list.addAll(newsBean.getResult().getData());
if (list != null){
handler.sendEmptyMessage(1);
}
}
}
@Override
public void onFailure(Call<NewsBean> call, Throwable t) {
}
});
}
}
希望能够帮助到大家~~~~
下一篇准备写下retrofit+okhttp