[AS2.3.3]retrofit2的基础使用

本篇内容大部分来自网上查阅,做个简单整合。自当记录,鸽了很久。本来很早就想写了的_(:з」∠)_


首先,网络框架一直都是app使用的基础。应用几乎都是要联网的。所以这个目前最火的网络框架确实是一堆人在使用了!

本篇只是做了一个简单的基础使用和记录!


开始使用先引入资源

    compile 'com.squareup.okhttp3:okhttp:3.8.1'
    compile 'io.reactivex.rxjava2:rxjava:2.1.1'
    compile 'io.reactivex.rxjava2:rxandroid:2.0.1'
    compile 'com.squareup.retrofit2:retrofit:2.3.0'
    compile 'com.squareup.retrofit2:adapter-rxjava2:2.3.0'
    compile 'com.squareup.retrofit2:converter-gson:2.3.0'

1.retrofit2的基础使用

只需要创建一个Retrofit对象就可以直接用了!

首先是创建Retrofit对象

            Retrofit retrofit = new Retrofit.Builder()
                    .baseUrl(url)
                    .addConverterFactory(GsonConverterFactory.create())
                    .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
                    .build();
这边加入了Gson工厂和RxJava2工厂 是为了让返回的结果可以直接转成Gson或者RxJava2对象


之后我们就可以使用这个对象访问网址了

这边我创建了一个url保存接口

IHomeService.java

package com.gjn.msdemo.homepage.Interface;

import com.gjn.msdemo.homepage.model.JokeModel;
import com.gjn.msdemo.homepage.model.PicModel;

import io.reactivex.Observable;
import okhttp3.ResponseBody;
import retrofit2.http.GET;
import retrofit2.http.Path;
import retrofit2.http.Query;

/**
 * IHomeService
 * Author: gjn.
 * Time: 2017/7/10.
 */

public interface IHomeService {
    /**
     * http://gank.io/api/data/福利/10/1
     * @param count 获取数量
     * @param page  页数
     * @return
     */
    @GET("{count}/{page}")
    Observable<PicModel> getPicData(@Path("page") int page,
                                    @Path("count") int count);

    /**
     * http://japi.juhe.cn/joke/content/text.from?key=ae240f7fba620fc370b803566654949e&page=1&pagesize=10
     * @param page      页数
     * @param pagesize  获取数量
     * @return
     */
    @GET("text.from?key=ae240f7fba620fc370b803566654949e")
    Observable<ResponseBody> getJokeData(@Query("page") int page,
                                         @Query("pagesize") int pagesize);

}


我将访问网址返回的结果转化成了一个RxJava2对象  并且 一个是Gson化的对象  一个是默认Retrofit返回结果就是okHttp3的返回结果

.

以下是两个访问的调用方法

        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl("http://gank.io/api/data/福利/")
                .addConverterFactory(GsonConverterFactory.create())
                .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
                .build();

        Observable<PicModel> picData = retrofit
                .create(IHomeService.class)
                .getPicData(1,10)
                .subscribeOn(Schedulers.io());

        picData.subscribe(new Consumer<PicModel>() {
            @Override
            public void accept(@NonNull PicModel picModel) throws Exception {
                for (PicModel.ResultsBean resultsBean : picModel.getResults()) {
                    Log.e("picData", resultsBean.getUrl());
                }
            }
        });

        Retrofit retrofit2 = new Retrofit.Builder()
                .baseUrl("http://japi.juhe.cn/joke/content/")
                .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
                .build();

        Observable<ResponseBody> jokeData = retrofit2
                .create(IHomeService.class)
                .getJokeData(1,10)
                .subscribeOn(Schedulers.io());

        jokeData.subscribe(new Consumer<ResponseBody>() {
            @Override
            public void accept(@NonNull ResponseBody responseBody) throws Exception {
                Log.e("jokeData", responseBody.string());
            }
        });


打印结果如下


以上就是retrofit2的基础使用了!


2.rxjava2+retrofit2+okhttp3管理使用

我们可以封装一个管理类来控制这一连串的使用

下面是管理类

RORManager.java

package com.gjn.msdemo.util;

import java.util.concurrent.TimeUnit;

import okhttp3.OkHttpClient;
import retrofit2.Retrofit;
import retrofit2.adapter.rxjava2.RxJava2CallAdapterFactory;
import retrofit2.converter.gson.GsonConverterFactory;

/**
 * RORManager
 * Author: gjn.
 * Time: 2017/7/10.
 */

public class RORManager {
    private static RORManager rorManager;
    private Retrofit mRetrofit;
    private String url;
    private OkHttpClient mClient;

    private RORManager(){
    }

    public static RORManager getInstance() {
        if (rorManager == null){
            synchronized (RORManager.class){
                if (rorManager == null){
                    rorManager = new RORManager();
                }
            }
        }
        return rorManager;
    }

    public <T> T create(Class<T> service){
        if (service == null){
            throw new NullPointerException("service is null");
        }
        return mRetrofit.create(service);
    }

    public RORManager setOkHttpClient(OkHttpClient client){
        mClient = client;
        return this;
    }

    public RORManager setUrl(String url){
        this.url = url;
        mRetrofit = createRetrofit();
        return this;
    }

    private Retrofit createRetrofit() {
        if (mClient == null) {
            mClient = new OkHttpClient.Builder()
                    .connectTimeout(10, TimeUnit.SECONDS)
                    .writeTimeout(10,TimeUnit.SECONDS)
                    .readTimeout(10,TimeUnit.SECONDS)
                    .build();
        }

        Retrofit retrofit  = new Retrofit.Builder()
                .baseUrl(url)
                .client(mClient)
                .addConverterFactory(GsonConverterFactory.create())
                .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
                .build();

        return retrofit;
    }

}

这边来说明下

1.管理类所以 做成单列模式

2.我们需要每次都设置url 和 服务类 所以我们将这两个值提供出来 可以设置

3.这边也加入了一个可以设置okHttp3的方法,是为了让用户可以修改okHttp3的参数,例如有时候需要https判断等


然后让我们来使用这个工具类吧

还是调用上面url的方法

        Observable<PicModel> picData = RORManager.getInstance()
                .setUrl("http://gank.io/api/data/福利/")
                .create(IHomeService.class)
                .getPicData(1,10)
                .subscribeOn(Schedulers.io());

        picData.subscribe(new Consumer<PicModel>() {
            @Override
            public void accept(@NonNull PicModel picModel) throws Exception {
                for (PicModel.ResultsBean resultsBean : picModel.getResults()) {
                    Log.e("picData", resultsBean.getUrl());
                }
            }
        });

        Observable<ResponseBody> jokeData = RORManager.getInstance()
                .setUrl("http://japi.juhe.cn/joke/content/")
                .create(IHomeService.class)
                .getJokeData(1,10)
                .subscribeOn(Schedulers.io());

        jokeData.subscribe(new Consumer<ResponseBody>() {
            @Override
            public void accept(@NonNull ResponseBody responseBody) throws Exception {
                Log.e("jokeData", responseBody.string());
            }
        });


其中就是吧每次创建retrofit2对象写进管理方法里面。实际操作和正常使用差不多,就是简单的封装而已!


全部代码

PicModel .java

package com.gjn.msdemo.homepage.model;

import java.util.List;

/**
 * PicModel
 * Author: gjn.
 * Time: 2017/7/10.
 */

public class PicModel {

    private boolean error;
    private List<ResultsBean> results;

    public boolean isError() {
        return error;
    }

    public void setError(boolean error) {
        this.error = error;
    }

    public List<ResultsBean> getResults() {
        return results;
    }

    public void setResults(List<ResultsBean> results) {
        this.results = results;
    }

    public static class ResultsBean {

        private String _id;
        private String createdAt;
        private String desc;
        private String publishedAt;
        private String source;
        private String type;
        private String url;
        private boolean used;
        private String who;

        public String get_id() {
            return _id;
        }

        public void set_id(String _id) {
            this._id = _id;
        }

        public String getCreatedAt() {
            return createdAt;
        }

        public void setCreatedAt(String createdAt) {
            this.createdAt = createdAt;
        }

        public String getDesc() {
            return desc;
        }

        public void setDesc(String desc) {
            this.desc = desc;
        }

        public String getPublishedAt() {
            return publishedAt;
        }

        public void setPublishedAt(String publishedAt) {
            this.publishedAt = publishedAt;
        }

        public String getSource() {
            return source;
        }

        public void setSource(String source) {
            this.source = source;
        }

        public String getType() {
            return type;
        }

        public void setType(String type) {
            this.type = type;
        }

        public String getUrl() {
            return url;
        }

        public void setUrl(String url) {
            this.url = url;
        }

        public boolean isUsed() {
            return used;
        }

        public void setUsed(boolean used) {
            this.used = used;
        }

        public String getWho() {
            return who;
        }

        public void setWho(String who) {
            this.who = who;
        }
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值