0

0

0

修罗

站点介绍

只有了解事实才能获得真正的自由

封装网络请求框架(二)OkHttp+Retrofit

修罗 2023-01-25 220 0条评论 安卓

首页 / 正文

OkHttp和Retrofit实例

NetworkModule.java提供OkHttpRetrofit实例

public class NetworkModule {
     // 提供OkHttpClient
    public static OkHttpClient provideOkHttpClient() { }

    // 提供Retrofit实例
    public static Retrofit provideRetrofit(OkHttpClient okHttpClient) { }
}

provideOkHttpClient()方法体

public static OkHttpClient provideOkHttpClient() {
    // 初始化okhttp
    OkHttpClient.Builder okhttpClientBuilder = new OkHttpClient.Builder();

    // 配置缓存。 AppContext.getInstance():需要配置application,提供一个获取实例的方法
    Cache cache = new Cache(AppContext.getInstance().getCacheDir(), Config.NETWORK_CACHE_SIZE);
    okhttpClientBuilder.cache(cache);

    okhttpClientBuilder.connectTimeout(60, TimeUnit.SECONDS) //连接超时时间
            .writeTimeout(60, TimeUnit.SECONDS) //写,也就是将数据发送到服务端超时时间
            .readTimeout(60, TimeUnit.SECONDS); //读,将服务端的数据下载到本地

    // 调试模式。 Config.DEBUG 即:BuildConfig.DEBUG
    if (Config.DEBUG) {

        // 创建okhttp日志拦截器
        HttpLoggingInterceptor loggingInterceptor = new HttpLoggingInterceptor();

        // 设置日志等级
        loggingInterceptor.level(HttpLoggingInterceptor.Level.BASIC);

        // 添加到网络框架中
        okhttpClientBuilder.addInterceptor(loggingInterceptor);

    }

    return okhttpClientBuilder.build();
}

provideRetrofit(OkHttpClient okHttpClient)方法体,需要传入OkHttp实例

public static Retrofit provideRetrofit(OkHttpClient okHttpClient) {
    return new Retrofit.Builder()
        // 让retrofit使用okhttp
        .client(okHttpClient)

        // baseapi地址。Config.ENDPOINT:/archives/5559/
        .baseUrl(Config.ENDPOINT)

        // 适配rxjava
        .addCallAdapterFactory(RxJava3CallAdapterFactory.create())

        // 使用gson解析json
        // 包括请求参数和响应
        .addConverterFactory(GsonConverterFactory.create(JSONUtil.createGson()))

        // 创建retrofit
        .build();
}

JSONUtil.java

public class JSONUtil {
    public static Gson createGson() {
        GsonBuilder gsonBuilder = new GsonBuilder();

        // 后端返回的create_at 转成 createAt,安卓发送时createAt 转 create_at
        gsonBuilder.setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES);
        return gsonBuilder.create();
    }

    public static String toJSON(Object data) {
        return createGson().toJson(data);
    }

    /**
     * 将Json转为对象
     *
     * @param data
     * @param clazz
     * @param <T>
     * @return
     */
    public static <T> T fromJSON(String data, Class<T> clazz) {
        //通过gson转换
        return createGson()
                .fromJson(data, clazz);
    }
}

service接口

一个service方法就是一个请求接口

public interface DefaultService {

    // 请求:v1/sheets?category=${Category}&size=${size}
    // 这个方法会拼接上在retrofit设置的baseUrl
    @GET("v1/sheets")
    Observable<JsonObject> sheets(@Query(value = "category") String Category, @Query(value = "size") int size);

}

JsonObject可以改成请求接口数据的模型类,这里直接解析为json字符串,没有转为java模型。

使用

retrofit创建service实例,请求service接口:

private DefaultService service;
...

    OkHttpClient okHttpClient = NetworkModule.provideOkHttpClient();
    Retrofit retrofit = NetworkModule.provideRetrofit(okHttpClient);

    service = retrofit.create(DefaultService.class);

    binding.button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            testRetrofitGet();
        }
    });

    /**
     * Retrofit Get
     */
    private void testRetrofitGet() {
        service.sheets(null, 10)
            // 网络执行在子线程
            .subscribeOn(Schedulers.io())
            // 请求完成,观察者在主线程执行(onSubscribe,onNext,onError,onComplete)
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(new Observer<JsonObject>() {
                // subscribe调用执行
                @Override
                public void onSubscribe(@NonNull Disposable d) {
                    Log.d(TAG, "onSubscribe" );
                }

                // 请求完成执行
                @Override
                public void onNext(@NonNull JsonObject jsonObject) {
                    Log.d(TAG, "onNext" + jsonObject);
                }

                // 请求失败执行
                @Override
                public void onError(@NonNull Throwable e) {
                    Log.d(TAG, "onError" + e.getMessage());
                }

                // 请求完成不管成功失败都执行
                @Override
                public void onComplete() {
                    Log.d(TAG, "onComplete" );
                }
            });

    }

1690024765493.png

评论(0)


最新评论

  • 1

    1

  • 1

    1

  • -1' OR 2+158-158-1=0+0+0+1 or 'TKCTZnRa'='

    1

  • 1

    1

  • 1

    1

  • 1

    1

  • 1

    1

  • @@5Qa2D

    1

  • 1

    1

  • 1

    1

日历

2025年09月

 123456
78910111213
14151617181920
21222324252627
282930    

文章目录

推荐关键字: Linux webpack js 算法 MongoDB laravel JAVA jquery javase redis