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

前言

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

上面为前一半路径加上接口里面的请求路径我们来看看是什么样的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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值