Retrofit+Rxjava网络层的优雅封装,Android开发教程入门

本文介绍了如何在Android开发中优雅地封装Retrofit+RxJava进行网络请求,并提供了NetMgr类的代码示例。同时,文章强调了面试准备的重要性,包括熟悉简历上的技术、理解项目实现原理以及提升面试技巧。作者分享了面试经验,建议先从小公司开始练习面试,并在面试过程中保持礼貌。此外,还提到了Android进阶学习资料和面试题库的开源资源。
摘要由CSDN通过智能技术生成

public class NetMgr {
private final long connectTimeoutMills = 10 * 1000L;
private final long readTimeoutMills = 10 * 1000L;
private NetProvider sProvider = null;
private static NetMgr instance;
private Map<String, NetProvider> providerMap = new HashMap<>();
private Map<String, Retrofit> retrofitMap = new HashMap<>();
private Map<String, OkHttpClient> clientMap = new HashMap<>();

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


public <S> S get(String baseUrl, Class<S> service) {
    return getInstance().getRetrofit(baseUrl).create(service);
}

public void registerProvider(NetProvider provider) {
    this.sProvider = provider;
}

public void registerProvider(String baseUrl, NetProvider provider) {
    getInstance().providerMap.put(baseUrl, provider);
}

public NetProvider getCommonProvider() {
    return sProvider;
}

public void clearCache() {
    getInstance().retrofitMap.clear();
    getInstance().clientMap.clear();
}

public Retrofit getRetrofit(String baseUrl) {
    return getRetrofit(baseUrl, null);
}

public Retrofit getRetrofit(String baseUrl, NetProvider provider) {
    if (empty(baseUrl)) {
        throw new IllegalStateException("baseUrl can not be null");
    }
    if (retrofitMap.get(baseUrl) != null) {
        return retrofitMap.get(baseUrl);
    }

    if (provider == null) {
        provider = providerMap.get(baseUrl);
        if (provider == null) {
            provider = sProvider;
        }
    }
    checkProvider(provider);

    Gson gson = new GsonBuilder()
            .setDateFormat("yyyy-MM-dd HH:mm:ss")
            .create();

    Retrofit.Builder builder = new Retrofit.Builder()
            .baseUrl(baseUrl)
            .client(getClient(baseUrl, provider))
            .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
            .addConverterFactory(GsonConverterFactory.create(gson));

    Retrofit retrofit = builder.build();
    retrofitMap.put(baseUrl, retrofit);
    providerMap.put(baseUrl, provider);

    return retrofit;
}

private boolean empty(String baseUrl) {
    return baseUrl == null || baseUrl.isEmpty();
}

private OkHttpClient getClient(String baseUrl, NetProvider provider) {
    if (empty(baseUrl)) {
        throw new IllegalStateException("baseUrl can not be null");
    }
    if (clientMap.get(baseUrl) != null) {
        return clientMap.get(baseUrl);
    }

    checkProvider(provider);

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

    builder.connectTimeout(provider.configConnectTimeoutSecs() != 0
            ? provider.configConnectTimeoutSecs()
            : connectTimeoutMills, TimeUnit.SECONDS);
    builder.readTimeout(provider.configReadTimeoutSecs() != 0
            ? provider.configReadTimeoutSecs() : readTimeoutMills, TimeUnit.SECONDS);

    builder.writeTimeout(provider.configWriteTimeoutSecs() != 0
            ? provider.configReadTimeoutSecs() : readTimeoutMills, TimeUnit.SECONDS);
    CookieJar cookieJar = provider.configCookie();
    if (cookieJar != null) {
        builder.cookieJar(cookieJar);
    }
    provider.configHttps(builder);

    RequestHandler handler = provider.configHandler();
    if (handler != null) {
        builder.addInterceptor(new NetInterceptor(handler));
    }

    Interceptor[] interceptors = provider.configInterceptors();
    if (!empty(interceptors)) {
        for (Interceptor interceptor : interceptors) {
            builder.addInterceptor(interceptor);
        }
    }

    if (provider.configLogEnable()) {
        HttpLoggingInterceptor loggingInterceptor = new HttpLoggingInterceptor();
        loggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
        builder.addInterceptor(loggingInterceptor);
    }

    OkHttpClient client = builder.build();
    clientMap.put(baseUrl, client);
    providerMap.put(baseUrl, provider);

    return client;
}

private boolean empty(Interceptor[] interceptors) {
    return interceptors == null || interceptors.length == 0;
}

private void checkProvider(NetProvider provider) {
    if (provider == null) {
        throw new IllegalStateException("must register provider first");
    }
}

public Map<String, Retrofit> getRetrofitMap() {
    return retrofitMap;
}

public Map<String, OkHttpClient> getClientMap() {
    return clientMap;
}

}


*   **2、实现NetProvider接口并注入**

NetMgr就是一个Retrofit的实现类,然后NetProvider是一个接口,需要在外部去实现,然后注入。再看一下NetProvider的实现类BaseNetProvider

public class BaseNetProvider implements NetProvider {

private static final long CONNECT_TIME_OUT = 30;
private static final long READ_TIME_OUT = 180;
private static final long WRITE_TIME_OUT = 30;


@Override
public Interceptor[] configInterceptors() {
    return null;
}

@Override
public void configHttps(OkHttpClient.Builder builder) {

}

@Override
public CookieJar configCookie() {
    return null;
}

@Override
public RequestHandler configHandler() {

    return new HeaderHandler();
}

@Override
public long configConnectTimeoutSecs() {
    return CONNECT_TIME_OUT;
}

@Override
public long configReadTimeoutSecs() {
    return READ_TIME_OUT;
}

@Override
public long configWriteTimeoutSecs() {
    return WRITE_TIME_OUT;
}

@Override
public boolean configLogEnable() {
    return BuildConfig.DEBUG;
}


private class HeaderHandler implements RequestHandler {

    @Override
    public Request onBeforeRequest(Request request, Interceptor.Chain chain) {
        return chain.request().newBuilder()
                .addHeader("X-Auth-Token", Constant.accessToken)
                .addHeader("Authorization", "")
                .build();
    }

    @Override
    public Response onAfterRequest(Response response, Interceptor.Chain chain)
            throws IOException {
        ApiException e = null;
        if (401 == response.code()) {
            throw new ApiException("登录已过期,请重新登录!");
        } else if (403 == response.code()) {
            throw new ApiException("禁止访问!");
        } else if (404 == response.code()) {
            throw new ApiException("链接错误");
        } else if (503 == response.code()) {
            throw new ApiException("服务器升级中!");
        } else if (500 == response.code()) {
            throw new ApiException("服务器内部错误!");
        }
        return response;
    }

最后

简历首选内推方式,速度快,效率高啊!然后可以在拉钩,boss,脉脉,大街上看看。简历上写道熟悉什么技术就一定要去熟悉它,不然被问到不会很尴尬!做过什么项目,即使项目体量不大,但也一定要熟悉实现原理!不是你负责的部分,也可以看看同事是怎么实现的,换你来做你会怎么做?做过什么,会什么是广度问题,取决于项目内容。但做过什么,达到怎样一个境界,这是深度问题,和个人学习能力和解决问题的态度有关了。大公司看深度,小公司看广度。大公司面试你会的,小公司面试他们用到的你会不会,也就是岗位匹配度。

选定你想去的几家公司后,先去一些小的公司练练,学习下面试技巧,总结下,也算是熟悉下面试氛围,平时和同事或者产品PK时可以讲得头头是道,思路清晰至极,到了现场真的不一样,怎么描述你所做的一切,这绝对是个学术性问题!

面试过程一定要有礼貌!即使你觉得面试官不尊重你,经常打断你的讲解,或者你觉得他不如你,问的问题缺乏专业水平,你也一定要尊重他,谁叫现在是他选择你,等你拿到offer后就是你选择他了。

金九银十面试季,跳槽季,整理面试题已经成了我多年的习惯!在这里我和身边一些朋友特意整理了一份快速进阶为Android高级工程师的系统且全面的学习资料。涵盖了Android初级——Android高级架构师进阶必备的一些学习技能。

附上:我们之前因为秋招收集的二十套一二线互联网公司Android面试真题(含BAT、小米、华为、美团、滴滴)和我自己整理Android复习笔记(包含Android基础知识点、Android扩展知识点、Android源码解析、设计模式汇总、Gradle知识点、常见算法题汇总。)

本文在开源项目:【CodeChina】中已收录,里面包含不同方向的自学编程路线、面试题集合/面经、及系列技术文章等,资源持续更新中…

理Android复习笔记(包含Android基础知识点、Android扩展知识点、Android源码解析、设计模式汇总、Gradle知识点、常见算法题汇总。)

[外链图片转存中…(img-7N6rkUTE-1630584897926)]

本文在开源项目:【CodeChina】中已收录,里面包含不同方向的自学编程路线、面试题集合/面经、及系列技术文章等,资源持续更新中…

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值