安卓开发基础知识-补习9
创始人
2024-04-02 10:28:08
0

听说点赞关注的人,身体健康,万事如意,工作顺利,爱情甜蜜,一夜暴富,升职加薪……最终迎娶白富美!!!


‼️微信公众号:炜煜工作室

🐱🐱🐱🐱🐱🐱🐱🐱🐱🐱🐱🐱🐱🐱🐱🐱🐱🐱🐱🐱🐱🐱🐱🐱🐱🐱🐱🐱🐱🐱🐱🐱🐱🐱🐱🐱🐱🐱🐱🐱🐱

📡 :安卓开发基础知识-补习9💯

📰内容简介:

本文介绍了okHTTP框架使用java代码进行开发,如果有问题的地方请不吝指教,如果对文内内容有不理解的地方,也希望能积极主动的联系博主进行深刻的探讨,以便于让博主更深刻的记住这篇博文的内容,好让博主在发光发热的道路上越走越远。[手动狗头]🐶努力,奋斗!

📎 标签:安卓;java;okHTTP框架;

🔍一、okHTTP框架

使用HttpClient框架有点负责,每次进行网络交互时,一些复杂的网络操作及异常处理都非常繁琐。并且Android Stdio也对HttpClient框架做了一些限制,下面介绍okHttp框架。

优点:

  1. 允许连接到同一个主机地址的所有请求,提高请求效率
  2. 共享Socket减少对服务器的请求次数。
  3. 通过连接池减少了请求延迟。
  4. 缓存相应数减少重复的网络请求。
  5. 减少了对数据流量的消耗。
  6. 自动处理GZIIp压缩
  7. 支持各个设计模式的拓展

使用流程

  1. 当通过OkHttpClient创建一个call,并发起同步或异步请求时,OkHtpp会通过Dispatcher对所有的RealCall(call的具体实现类)进行统一管理,并通过execute()及equeue()方法对同步或异步请求进行处理。
  2. execute()和equeue()这两个方法会最终调用RealCall中的getReponseWithInterceptorChain()fangfa ,从拦截器连中获取返回结果。
  3. 在拦截器链中,一次通过RetryAndFollowUpInterceptor(重定向拦截器),BridgeInterceptor(桥接拦截器)、CacheInterceptor(缓存拦截器)、ConntecInterceptor(连接拦截器)、CallServerInterceptor(网络拦截器)对请求一次处理。与服务建立连接后,获取返回数据,再经过上述拦截器依次处理后,最后将结果返回给调用方。

相关的类和API介绍

1.创建OkHttpClient对象,并设置连接超时时间(读取的可写可不写)

OkHttpClient mOkHttpClient = ``new` `OkHttpClient();

注意:这种设置超时时间是OKhttp2.0特有的通过方法来进行设置

mOkHttpClient.setConnectTimeout(``10``,TimeUnit.SECONDS);``mOkHttpClient.setReadTimeout(``10``,TimeUnit.SECONDS);
mOkHttpClient.setWriteTimeout(``10``,TimeUnit.SECONDS);

提示:设置超时时间在OKhttp3.0以后,使用build的方式进行

OkHttpClient okHttpClient =new OkHttpClient.Builder().connectTimeout(`10`, TimeUnit.SECONDS).readTimeout(``10``,TimeUnit.SECONDS).writeTimeout(``10``,TimeUnit.SECONDS).build();

//02.通过build来创建一个Request请求,没有设置get,而是直接设置一个url地址,默认就是一个get方式

final` `Request request = ``new` `Request.Builder()
url(``"https://xxxx.易大师.xxxxx"``)` ` .build();

//03.创建一个call对象,参数就是Request请求对象,发送请求

Call call = mOkHttpClient.newCall(request);``//04.请求加入调度 `` ``call.enqueue(``new` `Callback() ``  ``{ ``//请求失败执行的方法``     ``public` `void` `onFailure(Request request, IOException e){}``  ``//请求成功执行的方法,response就是从服务器得到的参数,response.body()可以得到任意类型,字符串,字节``        ``public` `void` `onResponse(``final` `Response response) ``throws` `IOException { ``          ``//这段代码可以拿到服务器的字符串.(通过response.body还可以拿到多种数据类型)``          ``//String htmlStr = response.body().string(); ``       ``} ``   ``});

get请求的步骤总结:首先构造一个Request对象,参数必须有个url参数,当然可以通过Request.Builder设置更多的参数比如:header、method等。

然后通过request的对象去构造得到一个Call对象,类似于将请求封装成了任务,既然是任务,就会有execute()和cancel()等方法。

最后,以异步的方式去执行请求,所以调用的是call.enqueue,将call加入调度队列,然后等待任务执行完成,在Callback中即可得到结果。

整体的写法还是比较长的,所以封装肯定是要做的。

okhttp注意:

onResponse回调的参数是response,一般情况下

  • 获得返回的字符串,通过response.body().string()获取;
  • 获得返回的二进制字节数组,则调用response.body().bytes();//通过二进制字节数组,可以转换为BItmap图片资源
  • 获得返回的inputStream,则调用response.body().byteStream() ;这里支持大文件下载,有inputStream可以通过IO的方式写文件。

不过也说明一个问题,这个onResponse执行的线程并不是UI线程(主线程不能有耗时操作)。如果希望操作控件,还是需要使用handler等

例如:``public` `void` `onResponse(``final` `Response response) ``throws` `IOException``{``   ``final` `String res = response.body().string();``   ``runOnUiThread(``new` `Runnable()``   ``{``     ``public` `void` `run()``     ``{``      ``TextView控件对象.setText(res);``     ``}``   ``});``}

这里是异步的方式去执行,也支持阻塞的方式,Call有一个execute()方法,可以直接调用call.execute()通过返回一个Response,最下面的代码就是

(二) Http Post 携带参数的使用步骤:

与get请求格式基本一致,就是Request的构造的不同。基于Http的文件,字符串,键值上传 [1]

  ``//0.0.RequestBody里所使用的上传参数的设定.(传一个字符串)``     ``定义为成员变量:JSON:MediaType JSON = MediaType.parse(``"application/json; charset=utf-8"``);``//"类型,字节码"``     ``String json = ``"{\n"` `+ ``"\"name\": \"hello.android6.0\"\n"` `+ ``"}"``;``//就是一个字符串.  ``  ``//0.0.通过post传一个文件,非常方便.  ``    ``MediaType FIle = MediaType.parse(``"application/octet-stream"``);  ``    ``File file = ``new` `File(Environment.getExternalStorageDirectory(), ``"文件名.mp4"``);``//得到一个mp4的文件,file对象` `  ``//01.创建OkHttpClient对象.``    ``OkHttpClient mOkHttpClient=``new` `OkHttpClient(); ``  ``//02.通过create,创建一个RequestBody(参数1:数据类型 参数2:字符串,文件,byte数组..)``    ``RequestBody requestBody = RequestBody.create(JSON, json);``    ``//RequestBody requestBody = RequestBody.create(FIle , file );//上传一个文件的话``  ``//03.通过build来创建一个Request请求,需要指定post方式,并把RequestBody对象放入.``    ``Request request = ``new` `Request.Builder()``                  ``.url(``"http://XXX/易大师/YYY"``)``                  ``.post(requestBody对象)``                  ``.build();``  ``//04.创建一个call对象( 也可以省略的写为:mOkHttpClient.newCall(request).enqueue(new Callback(){.......});)``    ``Call call = mOkHttpClient.newCall(request对象);``  ``//05.请求加入调度(发送请求)``    ``call.enqueue(``new` `Callback()``      ``{  ``//请求失败执行的方法``        ``public` `void` `onFailure(Request request, IOException e){}``        ``//请求成功执行的方法,response就是从服务器得到的参数``        ``public` `void` `onResponse(``final` `Response response) ``throws` `IOException``        ``{``            ``//String htmlStr = response.body().string();``        ``}``      ``}); 

注意:后面的就和上面一样了。

(三)使用post进行表单(键值对)上传

(上一个使用的Create创建RequesBody)通过Builder构造RequestBody,叫做MultipartBuilder,一般用来用来上传表单(键值对) [1]

  ``//01.创建OkHttpClient对象.``    ``OkHttpClient mOkHttpClient=``new` `OkHttpClient();``  ``//02.通过new FormEncodingBuilder()调用build方法,创建一个RequestBody,可以用add添加键值对``    ``RequestBody requestBody = ``new` `FormEncodingBuilder()    ``                       ``.add(``"YYY"``, ``"XXX"``)``                       ``.add(``"version"``, ``"23"``)    ``                       ``.build();``  ``注意:okhttp3.``0``以后就不能用采用FormEncodingBuilder的方式来创建表格,而是采用FormBody``  ``2``.通过``new` `FormBody()调用build方法,创建一个RequestBody,可以用add添加键值对     ``   ``FormBody formBody = ``new` `FormBody.Builder() ``               ``.add(``"XXX"``,易大师) ``               ``.add(``"YYY"``,YCF) ``               ``.build();`` ``//03.通过build来创建一个Request请求,需要指定post方式,并把RequestBody对象放入    ``   ``Request request = ``new` `Request.Builder()        ``               ``.url(``"http://XXX/易宸锋/YYY"``)        ``               ``.post(requestBody对象)        ``               ``.build();`` ``//04.创建一个call对象( 也可以省略的写为:mOkHttpClient.newCall(request).enqueue(new Callback(){.......});)``   ``Call call = mOkHttpClient.newCall(request对象); ``//05.请求加入调度(发送请求)``  ``call.enqueue(``new` `Callback()``    ``{  ``//请求失败执行的方法``      ``public` `void` `onFailure(Request request, IOException e){}``       ``//请求成功执行的方法,response就是从服务器得到的参数``      ``public` `void` `onResponse(``final` `Response response) ``throws` `IOException``      ``{``          ``//String htmlStr = response.body().string();``      ``}``    ``}); ```java
import android.os.Bundle;
import android.widget.Toast;import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.DefaultItemAnimator;
import androidx.recyclerview.widget.DividerItemDecoration;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;import com.gohi.tools.R;import java.io.IOException;import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;public class testMainActivity extends AppCompatActivity {private LinearLayoutManager linearLayoutManager;private RecyclerView recyclerView;private String url = "localhost:8080/BookShop/shopSer?keyword=1";private List goodInfoList;@Overrideprotected void onCreate(@Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);recyclerView = (RecyclerView) findViewById(R.id.xxx);getData(url);}private void getData(String url) {OkHttpClient client = new OkHttpClient();Request request = new Request. Builder().url(url).build();Call call = client.newCall(request);call.enqueue(new Callback() {@Overridepublic void onFailure(@NonNull Call call, @NonNull IOException e) {Toast.makeText(testMainActivity.this,"连接失败了,请稍后再试!",Toast.LENGTH_SHORT).show();}@Overridepublic void onResponse(@NonNull Call call, @NonNull Response response) throws IOException {if (response.isSuccessful()){String result = response.body().string();System.out.println("result="+result);//处理UI需要切换到UI线程goodInfoList = JsonUtil.json2ArrayList(result,GoodInfo.class);if (goodInfoList != null){runOnUiThread(new Runnable() {@Overridepublic void run() {linearLayoutManager = new LinearLayoutManager(testMainActivity.this);//为recycleViews设定动画recyclerView.setItemAnimator(new DefaultItemAnimator());//为recycleView添加分割线recyclerView.addItemDecoration(new DividerItemDecoration(testMainActivity.this,DividerItemDecoration.VERTICAL));//设置适配器recyclerView.setAdapter(new GoodListAdapter(testMainActivity.this,goodInfoList));}});}}}});}
}

:cat::cat::cat::cat::cat::cat::cat::cat::cat::cat::cat::cat::cat::cat::cat::cat::cat:## :pushpin:内容总结:###   :clock1030:本文介绍了okHTTP框架,还有:bug:没有写到本文内,后续内容可以继续追踪博主的后续文章,或许会介绍相关的内容,如果没介绍,请用力踢一脚,好让摸鱼的博主积极主动的去认识错误并及时改正,在发光发热的道路上越走越远……
表情网站:[🎁 Emoji cheat sheet for GitHub, Basecamp, Slack & more (webfx.com)](https://www.webfx.com/tools/emoji-cheat-sheet/)

相关内容

热门资讯

美元预测:周四零售销售数据会将...   来源:汇通网  周三(5月14日)欧盘时段,美元指数(DXY)盘中跌至100.58,下跌0.40...
欧洲债市:意大利与德国国债利差...   意大利与德国国债利差一度跌破100个基点,为2021年9月以来首次出现,反映风险偏好改善。  意...
朝阳无限社区邻里节暖心启幕 转自:劳动午报 近日,朝阳区八里庄街道朝阳无限社区举办“爱满无限 睦邻同心 共筑美好”主题邻里节,通...
马来西亚18岁中国留学生绑架案... 5月13日,两名中国留学生在马来西亚伪造绑架,骗取父母500万元赎金,被警方逮捕。5月14日,曾协助...
健康证不“健康” 不是小事 转自:劳动午报 我们日常生活中接触到的厨师、外卖配送员、护工、月嫂等从业人员,每年都至少要进行一次相...
市总工会公益普法活动走进市公园... 转自:劳动午报 本报讯(记者 余翠平)2025年5月是第五个“民法典宣传月”,为落实北京市总工会“八...
普京:准备欢迎西方公司回归 据俄罗斯媒体13日报道,俄罗斯总统普京当天表示,只要符合俄罗斯的经济利益,俄罗斯准备欢迎在俄乌冲突升...
山东“救人缺考”学生将全力准备... 转自:千龙网5月14日下午,山东省教育招生考试院发布公告称,经报请上级主管部门同意,将按程序启用春季...
我市实施排水管网建设改造攻坚行... 5月14日,在第34个全国城市节水宣传周到来之际,市住建委发布消息,今年我市大力实施排水管网建设改造...
黄金突然跳水!跌破3180美元 黄金突然再跳水!5月14日晚,现货黄金跌势不止,向下跌破3180美元/盎司,创4月15日以来的新低。...
“四举措”做好环境秩序执法保障... 转自:劳动午报 近日,门头沟区城市管理综合行政执法局强化重点保障地区占道经营、生活垃圾分类、非法小广...
15项举措支持加快构建科技金融... 转自:劳动午报 新华社电 创新之花离不开金融活水的浇灌。科技部、中国人民银行等7部门近日联合发布《加...
北京公交集团6位劳模工匠讲述成... 转自:劳动午报 本报讯 (记者 盛丽)近日,北京公交集团公司工会举办了“中国梦·劳动美——风华百年 ...
向佐分享与郭碧婷婚后幸福秘诀:... 近日,向佐接受采访,向佐郭碧婷2019年结婚至今已有6年,谈到老婆和孩子,向佐脸上露出了笑容,那是他...
城市表情|大风吹 转自:千龙网时间:5月14日地点:北京前门场景:一位小朋友的伞被大风吹起。新京报记者 薛珺 摄
上市券商分红总额攀新高释放行业...   炒股就看金麒麟分析师研报,权威,专业,及时,全面,助您挖掘潜力主题机会! 转自:证券日报   ...
自由现金流策略受关注 公募机构...   首批中证全指自由现金流ETF陆续上市。5月13日,招商基金管理有限公司、工银瑞信基金管理有限公司...
05月15日 新西兰元兑美元跌... Hehson外汇消息2025年05月15日,截至00时41分,外汇市场上新西兰元兑美元汇率跌破1新西...
七部门联合发布15项科技金融政... 转自:证券日报    本报记者 郭冀川    5月14日,科技部、中国人民银行、国家金融监督管理总局...
修旧利废助力降本增效 转自:劳动午报 今年以来,晋能控股煤业集团塔山煤矿公司本着“修旧利废、变废为宝、节支降耗”的原则,倡...