2024年安卓最新【Android】网络编程之OKHTTP与Retrofit框架(1),2024年最新蚂蚁金服 面经

题外话

我在一线互联网企业工作十余年里,指导过不少同行后辈。帮助很多人得到了学习和成长。

我意识到有很多经验和知识值得分享给大家,也可以通过我们的能力和经验解答大家在IT学习中的很多困惑,所以在工作繁忙的情况下还是坚持各种整理和分享。但苦于知识传播途径有限,很多程序员朋友无法获得正确的资料得到学习提升,故此将并将重要的Android进阶资料包括自定义view、性能优化、MVC与MVP与MVVM三大框架的区别、NDK技术、阿里面试题精编汇总、常见源码分析等学习资料。

【Android思维脑图(技能树)】

知识不体系?这里还有整理出来的Android进阶学习的思维脑图,给大家参考一个方向。

希望我能够用我的力量帮助更多迷茫、困惑的朋友们,帮助大家在IT道路上学习和发展~

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

3.2.2 数据解析

这是返回的数据还是没有经过解析的,我们可以使用上节课的GSON搭配实体类插件GsonFormatPlus来解析数据

第一步:添加gson依赖


  //添加GSON依赖

    implementation 'com.google.code.gson:gson:2.9.0'



image-20220512003426393

第二步:创建实体类

我们可以复制json数据,通过实体类插件GsonFormatPlus快速创建

android9.1

第三步:解析数据


//GSON搭配实体类插件`GsonFormatPlus`来解析数据

    Gson gson=new Gson();

    Student student=gson.fromJson(result,Student.class);



image-20220512004546140

第四步:设置到文本控件上显示

我们先得给文本控件取一个id,为了方便查看,我设置了文本的大小和颜色

image-20220512004824300

然后将解析出的数据设置到文本控件上

同样的在okhttp中我们需要切换线程到主线程来设置数据到控件上,说明okhttp框架只帮我们解决了构建子线程的问题,线程切换还是需要自己实现

运行可以看到名字已经解析出来并显示在虚拟机上

image-20220512190625102

3.3 MainActivity完整代码



public class MainActivity extends AppCompatActivity {



    @Override

    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);



        TextView txtView = findViewById(R.id.txtVId1);



        //发起请求

        //无需手动创建子线程,框架默认帮我们创建



        //1.创建一个okhttp对象

        OkHttpClient okHttpClient=new OkHttpClient();

        //2.创建一个Request对象,里面存放请求到的数据,调用Request类里的builder()方法,相当于调用了Request的静态方法

        //.url请求的地址

        //.get() 请求的方式 常用的请求方法1.get()   2.post() 这个由后端的接口决定

        //.build()

        Request request=new Request.Builder()

                .url("http://121.4.44.56/object")

                .get()

                .build();

        //3.将数据放到okHttpClient对象中

        Call call = okHttpClient.newCall(request);

        call.enqueue(new Callback() {//enqueue一个队列,程序可以发起多个请求,将这些请求存在队列中一个一个的处理

            @Override

            public void onFailure(@NonNull Call call, @NonNull IOException e) {

                //请求失败,打印解析失败原因

                Log.i("onFailure", "onFailure: "+e.getMessage());

            }



            @Override

            public void onResponse(@NonNull Call call, @NonNull Response response) throws IOException {

                //请求成功,通过response对象返回请求到的数据

                //子线程

                String result=response.body().string();

                Log.i("onResponse", "onResponse: "+result);



                //GSON搭配实体类插件`GsonFormatPlus`来解析数据

                Gson gson=new Gson();

                Student student=gson.fromJson(result,Student.class);

                //抛出到主线程

                runOnUiThread(new Runnable() {

                      @Override

                      public void run() {

                          txtView.setText(student.name);

                      }

                  }

                );



            }

        });



        //优势一:无需自己创建子线程

        //优势二:返回的数据不再是数据流,而是转换好的string字符串

        //优势三:自动处理异常情况,提供`onFailure()`方法

    }

}



4. 在线接口

===========================================================================

1.介绍 · fastmock教程 (gitee.io)

fastmock可以让你在没有后端程序的情况下能真实地在线模拟ajax请求,你可以用fatmock实现项目初期纯前端的效果演示,也可以用fastmock实现开发中的数据模拟从而实现前后端分离。

5. Retrofit

===============================================================================

网络请求-》java-》OKHTTP-》Retrofit

数据解析-》java解析-》GSON配合插件解析

Retrofit是对http网络请求框架的封装,一般由okhttp来负责网络请求,retrofit对请求接口

进行封装。retrofit通过接口和注解来描述我们的网络请求,然后通过client去调用okhttp

框架,通过addConverterFactory来实现对返回的json数据进行处理,转换成我们需要的数

据类型,可以理解为okhttp的加强版,底层封装了Okhttp

5.1 框架引入



    //添加okhttp依赖/

    implementation("com.squareup.okhttp3:okhttp:4.9.3")

    //添加Retrofit依赖

    implementation 'com.squareup.retrofit2:retrofit:2.9.0'

    implementation 'com.squareup.retrofit2:converter-gson:2.9.0'



image-20220512195435853

5.2 框架使用


5.2.1 创建接口

创建一个接口,返回值是Call类型,使用泛型封装Student类,注意引入包不要用okhttp的

image-20220512195933489


import retrofit2.Call;

import retrofit2.http.GET;



public interface Api {

    //http://121.4.44.56/object

    //使用get注解,放入请求的地址的最后一部分,前面的部分会在别处拼接

    @GET("object")

    Call<Student> getStudent();

}





5.2.2 数据请求&数据解析

回到MainActivity方法,将之前写的用okhttp框架的所有代码注释,以及删除对于的所有包

使用Retrofit框架来实现同样的功能

值得注意的是Retrofit框架在okhttp的基础上进一步封装,我们无需手动解析数据,也无需抛出线程


//使用Retrofit框架

//1..创建一个Retrofit对象

Retrofit retrofit=new Retrofit.Builder()

    .baseUrl("http://121.4.44.56/")

    .addConverterFactory(GsonConverterFactory.create())//表示以GSON框架解析数据

    .build();



//2.获取到Api接口

//返回一个接口实例

Api api = retrofit.create(Api.class);



//3.通过Api获取到实体类Student

retrofit2.Call<Student> call=api.getStudent();



//4.enqueue一个队列,程序可以发起多个请求,将这些请求存在队列中一个一个的处理

call.enqueue(new Callback<Student>() {

    @Override

    public void onResponse(Call<Student> call, Response<Student> response) {

        //请求成功:返回的结果是一个call对象,而不再是response,

        //默认将请求的结果抛回到主线程

        Student student = response.body();

        txtView.setText(student.name);

    }



    @Override

    public void onFailure(Call<Student> call, Throwable t) {

        //请求失败

    }

});



5.2.3 日志拦截(Retrofit优化)

Retrofit框架看上去已经很完美了,但是因为它帮我们完成了数据解析,我们无法捕获数据解析是否成功,所以当数据解析失败时通过response.body();是获取不到数据的

面对这个问题同样也有解决办法

我们引入一下依赖


//拦截日志依赖

implementation 'com.squareup.okhttp3:logging-interceptor:4.9.3'



image-20220512203216828

通过如下工具类进行拦截,使用这个工具类我们通过日志过滤的方法查看请求的状态和数据解析是否成功




public class RetrofitUtils {



    public static Retrofit getRetrofit(String url) {

        //日志显示级别

        HttpLoggingInterceptor.Level level= HttpLoggingInterceptor.Level.BODY;

        //新建log拦截器

        HttpLoggingInterceptor loggingInterceptor=new HttpLoggingInterceptor(new HttpLoggingInterceptor.Logger() {

            @Override

            public void log(String message) {

                Log.d("RetrofitMessage","OkHttp====Message:"+message);

            }

        });

        loggingInterceptor.setLevel(level);

        //定制OkHttp

        OkHttpClient.Builder httpClientBuilder = new OkHttpClient

                .Builder();

        //OkHttp进行添加拦截器loggingInterceptor

        httpClientBuilder.addInterceptor(loggingInterceptor);



        Retrofit retrofit = new Retrofit.Builder()

                .baseUrl(url)

                .addConverterFactory(GsonConverterFactory.create())

                .client( httpClientBuilder.build())

                .build();



        return retrofit;

    }



}



使用这个工具类也能简化请求数据的代码,我们只需这么一行代码就能拿到Api接口实例




## 最后

今天关于面试的分享就到这里,还是那句话,有些东西你不仅要懂,而且要能够很好地表达出来,能够让面试官认可你的理解,例如Handler机制,这个是面试必问之题。有些晦涩的点,或许它只活在面试当中,实际工作当中你压根不会用到它,但是你要知道它是什么东西。

最后在这里小编分享一份自己收录整理上述技术体系图相关的几十套**腾讯、头条、阿里、美团等公司19年的面试题**,把技术点整理成了视频和PDF(实际上比预期多花了不少精力),包含**知识脉络 + 诸多细节**,由于篇幅有限,这里以图片的形式给大家展示一部分。

还有 **高级架构技术进阶脑图、Android开发面试专题资料**,高级进阶架构资料 帮助大家学习提升进阶,也节省大家在网上搜索资料的时间来学习,也可以分享给身边好友一起学习。


**【Android核心高级技术PDF文档,BAT大厂面试真题解析】**

![](https://img-blog.csdnimg.cn/img_convert/9a9598f3fb84dbc3eba6d8fda1fff87f.webp?x-oss-process=image/format,png)

**【算法合集】**

![](https://img-blog.csdnimg.cn/img_convert/9f745f045756e98bbede246f63a13112.webp?x-oss-process=image/format,png)

**【延伸Android必备知识点】**

![](https://img-blog.csdnimg.cn/img_convert/3a0074c200064d9fe0891e5895fe9825.webp?x-oss-process=image/format,png)

**【Android部分高级架构视频学习资源】**

**Android精讲视频领取学习后更加是如虎添翼!**进军BATJ大厂等(备战)!现在都说互联网寒冬,其实无非就是你上错了车,且穿的少(技能),要是你上对车,自身技术能力够强,公司换掉的代价大,怎么可能会被裁掉,都是淘汰末端的业务Curd而已!现如今市场上初级程序员泛滥,这套教程针对Android开发工程师1-6年的人员、正处于瓶颈期,想要年后突破自己涨薪的,进阶Android中高级、架构师对你更是如鱼得水,赶快领取吧!



**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**

**[需要这份系统化学习资料的朋友,可以戳这里获取](https://bbs.csdn.net/topics/618156601)**

**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**

(img-B1KL2VYR-1715819210012)]

**【延伸Android必备知识点】**

[外链图片转存中...(img-74HwBxye-1715819210013)]

**【Android部分高级架构视频学习资源】**

**Android精讲视频领取学习后更加是如虎添翼!**进军BATJ大厂等(备战)!现在都说互联网寒冬,其实无非就是你上错了车,且穿的少(技能),要是你上对车,自身技术能力够强,公司换掉的代价大,怎么可能会被裁掉,都是淘汰末端的业务Curd而已!现如今市场上初级程序员泛滥,这套教程针对Android开发工程师1-6年的人员、正处于瓶颈期,想要年后突破自己涨薪的,进阶Android中高级、架构师对你更是如鱼得水,赶快领取吧!



**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**

**[需要这份系统化学习资料的朋友,可以戳这里获取](https://bbs.csdn.net/topics/618156601)**

**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值