一、最最最最最最基本的用法

一股脑的写法,缺点很明显,会造成代码很长而且不够简洁,不方便后来的阅读和维护。

Retrofit retrofit = new Retrofit.Builder()
        .baseUrl("(这里填写的是url)")
        .addConverterFactory(GsonConverterFactory.create()) //这里是为了直接用Gson解析数据,也可以不写,之后用ResponseBody
        .build;

    HotService service = retrofit.create(HotWebServce.class);
    call call = getMovieService.getHotList("武汉");//传入请求参数

    call.enqueue(new MoiveCallback() {
            @Override
            public void onResponse(Call call, Response response) {
                super.onResponse(call, response);
                //这里做请求成功的逻辑
            }
            @Override
            public void onFailure(Call call, Throwable t) {
                super.onFailure(call, t);
                //这里做请求失败的逻辑
            }
    });

二、之前一直在用的方法

将前半部分封装起来,直接调用,比第一种方法稍微简洁一些。缺点:会产生很多的文件,对于少量数据接口请求可以使用。

1、创建BaseWebApi:
public abstract class BaseWebApi {

        public String baseUrl = "http://api.douban.com/v2/movie/";

        Retrofit getApi(String url){
            return new Retrofit.Builder()
                    .baseUrl(url)
                    .addConverterFactory(GsonConverterFactory.create())
                    .build();
        }

        public abstract  T getServce();
}
2、每一个WebApi都继承自BaseWebApi:
public class HotWebApi extends BaseWebApi {

        Retrofit retrofit = getApi(baseUrl);

        @Override
        public  T getServce() {
            return (T) retrofit.create(HotWebServce.class);
        }
    }
3、使用:
HotWebApi hotWebApi = new HotWebApi();
    HotWebServce webServce = hotWebApi.getServce();
    Call call = webServce.getState("武汉");
    call.enqueue(new Callback() {
        @Override
        public void onResponse(Call call, final Response response) {
        ……
        }

        @Override
        public void onFailure(Call call, Throwable t) {
        ……
        }
    });

注:若需要打印url可使用:call.request().url().toString()

三、基于第二种方法并且减少创建的操作

封装Retrofit、CallBack

使用:

GetMovieService getMovieService =
        RetrofitUtil.retrofit(MovieApi.MOIVE_API)
        .create(GetMovieService.class);
    Call call = getMovieService.getHotList("武汉");
    call.enqueue(new MoiveCallback() {
        @Override
        public void onResponse(Call call, Response response) {
        super.onResponse(call, response);
        ……
        }

        @Override
        public void onFailure(Call call, Throwable t) {
            super.onFailure(call, t);
        }
    });

四、Rxjava+Retrofit进行网络请求

1、什么是rxjava

RxJava 类似 观察者模式。有一个Observable(被观察者,事件的发起者)和一个观察者(Subscriber,事件的接收者)。Observable发出一系列的事件,然后Subscriber处理这些事件。Observable 可以发送零到多个事件。Subscriber会接收它发的每一个事件。如果Observable没有对应的Subscriber,不会发送任何事件。

本质上说:一个实现异步操作的库,并且随着程序逻辑越来越复杂,rxjava依旧能够保持简洁

简单的了解什么是观察者模式

2、为什么要用rxjava

3、使用

Service:

@GET("in_theaters")
    Observable getHotList(@Query("city") String city);

retrofit部分:

//retrofit部分
    public  T create(Class service,String baseUrl){
        return new Retrofit.Builder()
                .baseUrl(baseUrl)
                .addConverterFactory(GsonConverterFactory.create())
                .addCallAdapterFactory(RxJava2CallAdapterFactory.create())  //加这一句(很关键
                .build()
                   .create(service);
    }

使用方法一:

RxMoiveService rxMoiveService = 
                            MoiveClient.getInstance()
                            .create(RxMoiveService.class,MovieApi.MOIVE_API);

    rxMoiveService.getHotList("武汉")
        .subscribeOn(Schedulers.newThread())
        .observeOn(AndroidSchedulers.mainThread())
        .subscribe(new Consumer() {
            @Override
            public void accept(MoiveListGsonBean moiveListGsonBean) throws Exception {
                ……
            }
        }, new Consumer() {
            @Override
            public void accept(Throwable throwable) throws Exception {
                ……
            }
        });

使用方法二:

RxMoiveService rxMoiveService = 
                            MoiveClient.getInstance()
                            .create(RxMoiveService.class,MovieApi.MOIVE_API);

    rxMoiveService.getFutureList()
            .subscribeOn(Schedulers.newThread())
            .observeOn(AndroidSchedulers.mainThread())
               .subscribe(new Observer() {
                @Override
                public void onSubscribe(Disposable d) {
                    Log.d(TAG, "onSubscribe");
                }

                @Override
                public void onNext(MoiveListGsonBean value) {
                    Log.d(TAG, "onNext");
                    ……
                }

                @Override
                public void onError(Throwable e) {
                    Log.d(TAG, "onError");
                }

                @Override
                public void onComplete() {
                    Log.d(TAG, "onComplete");
                }
            });

注:Consumer类:简易版本的Observer,可以自定义需要处理的信息

关于Rxjava的深入学习:给 Android 开发者的 RxJava 详解
Rxjava的github:ReactiveX/RxJava
RxAndroid的github:ReactiveX/RxAndroid