『Android基础入门』网络编程之OKHTTP与Retrofit框架

添加网络请求权限

image-20220511235948525

添加依赖


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



image-20220512000346633

3.2 框架使用


3.2.1 数据请求




public class MainActivity extends AppCompatActivity {



    @Override

    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);



        //发起请求

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



        //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);

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

        call.enqueue(new Callback() {

            @Override

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

                //请求失败

            }



            @Override

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

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

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

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

            }

        });

    }

}



由此我们可以知道okhttp框架相较于传统的网络请求的优势:

优势一:无需自己创建子线程,okhttp自动帮我们创建

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

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

打印测试结果:

image-20220512002617352

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();




**自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。**

**深知大多数Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!**

**因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。**
![img](https://img-blog.csdnimg.cn/img_convert/57eb8a1b90d19650345c83d559cd6377.png)
![img](https://img-blog.csdnimg.cn/img_convert/94e482a212f3caeef4d0c27501cc9db7.png)
![img](https://img-blog.csdnimg.cn/img_convert/2f9b37b3f313ff8a8061d56670d3e91c.png)
![img](https://img-blog.csdnimg.cn/img_convert/2036bc59605c44a1cc4674d9c787e9dc.png)
![img](https://img-blog.csdnimg.cn/img_convert/751dbe4efd8ccb6ec554716d577fe845.png)
![img](https://img-blog.csdnimg.cn/img_convert/7290d1d5d1faf8d857c55ead65e2f183.png)
![img](https://img-blog.csdnimg.cn/13f2cb2e05a14868a3f0fd6ac81d625c.png)

**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!**

**由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新**

**如果你觉得这些内容对你有帮助,可以添加V获取:vip204888 (备注Android)**
![img](https://img-blog.csdnimg.cn/img_convert/c77257e100319e72de2f2a200efdf5f8.png)



### Android高级架构师

由于篇幅问题,我呢也将自己当前所在技术领域的各项知识点、工具、框架等汇总成一份技术路线图,还有一些架构进阶视频、全套学习PDF文件、面试文档、源码笔记。

*   **330页PDF Android学习核心笔记(内含上面8大板块)**

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

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

*   **Android学习的系统对应视频**

*   **Android进阶的系统对应学习资料**

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

*   **Android BAT部分大厂面试题(有解析)**

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


好了,以上便是今天的分享,希望为各位朋友后续的学习提供方便。觉得内容不错,也欢迎多多分享给身边的朋友哈。



得这些内容对你有帮助,可以添加V获取:vip204888 (备注Android)**
[外链图片转存中...(img-SLkm1pUW-1712017104167)]



### Android高级架构师

由于篇幅问题,我呢也将自己当前所在技术领域的各项知识点、工具、框架等汇总成一份技术路线图,还有一些架构进阶视频、全套学习PDF文件、面试文档、源码笔记。

*   **330页PDF Android学习核心笔记(内含上面8大板块)**

[外链图片转存中...(img-rGYlA4V7-1712017104167)]

[外链图片转存中...(img-ePylqXuP-1712017104167)]

*   **Android学习的系统对应视频**

*   **Android进阶的系统对应学习资料**

[外链图片转存中...(img-8iFZZPeY-1712017104168)]

*   **Android BAT部分大厂面试题(有解析)**

[外链图片转存中...(img-xwUtaMFN-1712017104168)]


好了,以上便是今天的分享,希望为各位朋友后续的学习提供方便。觉得内容不错,也欢迎多多分享给身边的朋友哈。



> **本文已被[CODING开源项目:《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》]( )收录**
  • 12
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android中的网络通信可以通过OkHttpRetrofit来实现。 首先,在你的项目中需要引入OkHttpRetrofit的依赖。你可以在build.gradle文件中添加以下代码来引入依赖: ``` implementation 'com.squareup.okhttp3:okhttp:4.9.0' implementation 'com.squareup.retrofit2:retrofit:2.9.0' ``` 接下来,你需要创建一个OkHttpClient的实例,它将负责处理网络请求。你可以使用OkHttpClient的Builder来配置一些网络请求的参数,比如超时时间、拦截器等。例如: ``` OkHttpClient client = new OkHttpClient.Builder() .connectTimeout(10, TimeUnit.SECONDS) .readTimeout(10, TimeUnit.SECONDS) .build(); ``` 然后,你需要创建一个Retrofit的实例。Retrofit是一个类型安全的HTTP客户端,它可以根据你定义的接口自动生成网络请求的代码。你可以使用Retrofit的Builder来配置一些参数,比如base URL、转换器、适配器等。例如: ``` Retrofit retrofit = new Retrofit.Builder() .baseUrl("https://api.example.com/") .client(client) .addConverterFactory(GsonConverterFactory.create()) .addCallAdapterFactory(RxJava3CallAdapterFactory.create()) .build(); ``` 在这里,我们设置了一个base URL为"https://api.example.com/",使用了GsonConverterFactory来将JSON数据转换为对象,使用了RxJava3CallAdapterFactory来支持RxJava的Observable。 接下来,你需要定义一个接口,用于描述你的网络请求。你可以在接口中定义各种网络请求的方法,并使用注解来指定请求的URL、请求方法、请求参数等。例如: ``` public interface ApiService { @GET("users/{username}") Call<User> getUser(@Path("username") String username); } ``` 然后,你可以使用刚才创建的Retrofit实例来创建一个ApiService的实例,并调用接口中的方法来发起网络请求。例如: ``` ApiService apiService = retrofit.create(ApiService.class); Call<User> call = apiService.getUser("john"); call.enqueue(new Callback<User>() { @Override public void onResponse(Call<User> call, Response<User> response) { if (response.isSuccessful()) { User user = response.body(); // 处理返回的用户数据 } else { // 处理请求失败的情况 } } @Override public void onFailure(Call<User> call, Throwable t) { // 处理请求失败的情况 } }); ``` 以上就是使用OkHttpRetrofit进行网络通信的基本步骤。你可以根据自己的需求来定义更多的网络请求方法,并处理返回的数据或错误。需要注意的是,为了保证网络请求的安全性,你可能还需要在AndroidManifest.xml文件中添加网络权限。例如: ``` <uses-permission android:name="android.permission.INTERNET" /> ``` 希望以上信息对你有所帮助!如果还有其他问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值