您的位置:首页 > 理论基础 > 计算机网络

Android Retrofit+okHttp+RxJava 第一篇------Retrofit

2018-01-25 17:32 337 查看

前言

到这里发现自己已经还是写了一些东西了,然后发现在里面没得写过什么和网络有关的博客,于是准备一天写一篇,网络这方面的东西。现在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的代码了可以看我以前的文章

点这个地方看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();


上面为前一半路径加上接口里面的请求路径我们
4000
来看看是什么样的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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息