Android最火的框架系列(七)Retrofit

    网络请求框架,从最初使用Volley,到后来的Okhttp,再到Retrofit。我是一个比较保守的人,因为最早使用的网络请求库是Volley,所以很长一段时间都不想去使用其他的网络请求库。后来因为做一个平台类的框架,涉及到文件上传下载功能,所以,开始使用Okhttp。为什么没有直接使用Retrofit呢?因为当时公司不允许上外网,只能默默地离线使用Okhttp。使用Retrofit也好几个月了,习惯了它的简洁,也习惯了它基于注解的方式,搭配RxJava使用,非常的方便。

    一.Retrofit2的导入

        其中,包含RxJava2,Retrofit2,Okhttp3。RxJava2是为了和Retrofit2配合使用,okhttp3是为了封装Retrofit2工具类。如果只是使用Retrofit2,可以不导入另外两种库。

    implementation "io.reactivex.rxjava2:rxjava:2.2.8"
    implementation 'io.reactivex.rxjava2:rxandroid:2.1.1'

    implementation 'com.squareup.retrofit2:retrofit:2.5.0'
    implementation 'com.squareup.retrofit2:adapter-rxjava2:2.5.0'
    implementation 'com.squareup.retrofit2:converter-gson:2.5.0'

    implementation("com.squareup.okhttp3:okhttp:3.14.2")
    implementation 'com.squareup.okhttp3:logging-interceptor:3.14.2'

    二.Retrofit2的使用

    下面,是使用Retrofit2模拟用户登陆请求。

//不使用Rxjava
    private void loginWithoutRxJava() {

        Call call = RetrofitUtil.getInstance()
                .createService(TestService.class).loginWithoutRxJava(name.getText().toString(), password.getText().toString());

        call.enqueue(new Callback() {
            @Override
            public void onResponse(Call call, Response response) {
                try {
                    String result = response.body().string();
                    Gson gson = new Gson();
                    LoginBean loginbean = gson.fromJson(result, LoginBean.class);
                    if (loginbean.getResult().equals("success")) {
                        Toast.makeText(MainActivity.this, "Login success", Toast.LENGTH_SHORT).show();
                    } else {
                        Toast.makeText(MainActivity.this, "Login fail", Toast.LENGTH_SHORT).show();
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }

            @Override
            public void onFailure(Call call, Throwable t) {
                Toast.makeText(MainActivity.this, "Login fail", Toast.LENGTH_SHORT).show();
            }
        });
    }

三.Service类

        使用Rretrofit2,需要定义一个Service接口,里面是基于注解的网络请求的方法。AndroidServer/Servers是我自己基于Eclipse写的简单的服务器接口。如果你感兴趣,可以看一下:https://blog.csdn.net/qq_21154101/article/details/89480899

package com.example.tuduzhao.tudurxjava;

import io.reactivex.Observable;
import okhttp3.ResponseBody;
import retrofit2.Call;
import retrofit2.http.POST;
import retrofit2.http.Query;

public interface TestService {

    @POST("/AndroidServer/Servers")
    Call loginWithoutRxJava(@Query("username") String username, @Query("password") String password);

    @POST("/AndroidServer/Servers")
    Observable loginWithRxJava(@Query("username") String username, @Query("password") String password);

}

 

四.Retrofit2工具类

        下面是对Retrofit2封装的工具类RetrofitUtil:

package com.example.tuduzhao.tudurxjava.util;

import com.example.tuduzhao.tudurxjava.BuildConfig;

import java.util.concurrent.TimeUnit;

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

public class RetrofitUtil {
    private static Retrofit mRetrofit;
    private static RetrofitUtil mInstance;


    public RetrofitUtil() {

        OkHttpClient.Builder builder = new OkHttpClient.Builder();

        /**
         * 设置超时和重连
         */
        builder.connectTimeout(15, TimeUnit.SECONDS);
        builder.readTimeout(20, TimeUnit.SECONDS);
        builder.writeTimeout(20, TimeUnit.SECONDS);
        builder.retryOnConnectionFailure(true);

        /**
         * log信息拦截器
         */
        if (BuildConfig.DEBUG) {
            HttpLoggingInterceptor httpLoggingInterceptor = new HttpLoggingInterceptor();
            httpLoggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
            builder.addInterceptor(httpLoggingInterceptor);
        }


        OkHttpClient client = builder.build();
        mRetrofit = new retrofit2.Retrofit.Builder()
                .client(client)
                .baseUrl("http://10.0.35.229:8080/")//这里替换成自己的地址
                .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
                .addConverterFactory(GsonConverterFactory.create())
                .build();
    }

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

    public static  S createService(Class service) {
        if (mRetrofit == null) {
            throw new IllegalArgumentException("mRetrofit is null");
        } else {
            return mRetrofit.create(service);
        }
    }

}

        五.网络访问权限

        最后,不要忘记在manifext文件中添加网络请求权限。

        最后,总结一下,这篇博客是Retrofit2的入门级,按照博客所说的,可以使用Retrofit2做基本的网络请求。网络请求的方法全部封装在一个XXService的接口中为了使用更加方便,我们封装了一个工具类。当然,不建议单独使用Retrofit2,最好是配合RxJava使用。在后面的博客中,我会专门总结RxJava的一些使用。

你可能感兴趣的:(Android框架)