赞
踩
2. 原生HTTP网络访问的缺点
====================================================================================
- 每次网络访问需要放在子线程里
- 每次得到结果需要返回到主线程才能更新控件显示
- 需要对各种情况进行处理,没有对状态码判断
3. OKHTTP
=============================================================================
概述 - OkHttp (square.github.io)
HTTP是现代应用程序网络的方式。这就是我们交换数据和媒体的方式。有效地执行 HTTP 会使内容加载速度更快并节省带宽。
OkHttp 是一个默认高效的 HTTP 客户端:
- HTTP/2 支持允许对同一主机的所有请求共享一个套接字。
- 连接池可减少请求延迟(如果 HTTP/2 不可用)。
- 透明 GZIP 可缩小下载大小。
- 响应缓存完全避免了重复请求的网络。
OkHttp 适用于 Android 5.0+(API 级别 21+)和 Java 8+。
框架官网地址
https://github.com/square/okhttp
添加网络请求权限
添加依赖
implementation("com.squareup.okhttp3:okhttp:4.9.3")
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()
方法
打印测试结果:
这是返回的数据还是没有经过解析的,我们可以使用上节课的GSON搭配实体类插件GsonFormatPlus
来解析数据
第一步:添加gson依赖
//添加GSON依赖
implementation 'com.google.code.gson:gson:2.9.0'
第二步:创建实体类
我们可以复制json数据,通过实体类插件GsonFormatPlus
快速创建
第三步:解析数据
//GSON搭配实体类插件`GsonFormatPlus`来解析数据
Gson gson=new Gson();
Student student=gson.fromJson(result,Student.class);
第四步:设置到文本控件上显示
我们先得给文本控件取一个id,为了方便查看,我设置了文本的大小和颜色
然后将解析出的数据设置到文本控件上
同样的在okhttp中我们需要切换线程到主线程来设置数据到控件上,说明okhttp框架只帮我们解决了构建子线程的问题,线程切换还是需要自己实现
运行可以看到名字已经解析出来并显示在虚拟机上
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()`方法
}
}
===========================================================================
fastmock可以让你在没有后端程序的情况下能真实地在线模拟ajax请求,你可以用fatmock实现项目初期纯前端的效果演示,也可以用fastmock实现开发中的数据模拟从而实现前后端分离。
===============================================================================
网络请求-》java-》OKHTTP-》Retrofit
数据解析-》java解析-》GSON配合插件解析
Retrofit
是对http网络请求框架的封装,一般由okhttp
来负责网络请求,retrofit
对请求接口
进行封装。retrofit
通过接口和注解来描述我们的网络请求,然后通过client
去调用okhttp
框架,通过addConverterFactory
来实现对返回的json数据进行处理,转换成我们需要的数
据类型,可以理解为okhttp的加强版,底层封装了Okhttp。
//添加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'
创建一个接口,返回值是Call类型,使用泛型封装Student类,注意引入包不要用okhttp的
import retrofit2.Call;
import retrofit2.http.GET;
public interface Api {
## 文末
> 面试:如果不准备充分的面试,完全是浪费时间,更是对自己的不负责!
不管怎么样,不论是什么样的大小面试,要想不被面试官虐的不要不要的,只有刷爆面试题题做好全面的准备,当然除了这个还需要在平时把自己的基础打扎实,这样不论面试官怎么样一个知识点里往死里凿,你也能应付如流啊
**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**
**[需要这份系统化学习资料的朋友,可以戳这里获取](https://bbs.csdn.net/topics/618156601)**
**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。