Android 的网络加载

发起网络请求的过程

当用户在应用程序中输入网址或关键字时,应用程序会发起网络请求。这个过程大致如下:

  1. 应用程序将请求发送到服务器,服务器返回响应数据。
  2. 应用程序接收到响应数据后,将其转换为应用程序可识别的数据格式。
  3. 应用程序将转换后的数据展示给用户。

详细一点可以参考 Android网络请求,全方位优雅解析
网络请求步骤(用户输入一个网址到网页最终展现到用户面前)大致流程总结如下:

在客户端浏览器中输入网址URL。 发送到DNS(域名服务器)获得域名对应的WEB服务器的IP地址。
客户端浏览器与WEB服务器建立TCP(传输控制协议)连接。 客户端浏览器向对应IP地址的WEB服务器发送相应的HTTP或HTTPS请求。
WEB服务器响应请求,返回指定的URL数据或错误信息;如果设定重定向,则重定向到新的URL地址。
客户端浏览器下载数据,解析HTML源文件,解析的过程中实现对页面的排版,解析完成后,在浏览器中显示基础的页面。
分析页面中的超链接,显示在当前页面,重复以上过程直至没有超链接需要发送,完成页面的全部显示。

在这里插入图片描述

常用的网络加载框架

在这个过程中,Android提供了多种网络请求框架,如OkHttp、Retrofit等。这些框架可以帮助开发者快速实现网络请求,提高开发效率 。
安卓中常用的网络加载框架有:HttpURLConnection、Volley、OkHttp、Retrofit、FastAndroidNetworking等,它们各有优缺点。

HttpURLConnection

HttpURLConnection是Java提供的发起HTTP请求的基础类库,其继承自URLConnection,可用于向指定网站发送GET、POST请求。
以下是一个简单的使用案例:

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;public class HttpURLConnectionExample {public static void main(String[] args) throws Exception {String url = "https://www.baidu.com/s?wd=java";URL obj = new URL(url);HttpURLConnection con = (HttpURLConnection) obj.openConnection();con.setRequestMethod("GET");con.setRequestProperty("User-Agent", "Mozilla/5.0");int responseCode = con.getResponseCode();System.out.println("Response Code : " + responseCode);BufferedReader in = new BufferedReader(new InputStreamReader(con.getInputStream()));String inputLine;StringBuffer response = new StringBuffer();while ((inputLine = in.readLine()) != null) {response.append(inputLine);}in.close();// print resultSystem.out.println(response.toString());}
}

Volley

由Google开发,支持异步请求和缓存,支持图片、JSON、XML等多种数据格式的传输,支持拦截器和自定义转换器。但是它不支持GZIP压缩,而且在内存不足时会出现卡顿现象。
以下是一个简单的使用案例:

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import com.android.volley.Request;
import com.android.volley.RequestQueue;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.StringRequest;
import com.android.volley.toolbox.Volley;public class MainActivity extends AppCompatActivity {private static final String TAG = "MainActivity";private RequestQueue mRequestQueue;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);mRequestQueue = Volley.newRequestQueue(this);String url = "https://www.baidu.com/s?wd=java";StringRequest stringRequest = new StringRequest(Request.Method.GET, url, new Response.Listener<String>() {@Overridepublic void onResponse(String response) {Log.d(TAG, response);}}, new Response.ErrorListener() {@Overridepublic void onErrorResponse(VolleyError error) {Log.e(TAG, error.toString());}});mRequestQueue.add(stringRequest);}
}

OkHttp

由Square公司开发,支持HTTP/2协议,支持连接池和缓存,支持POST请求和文件上传下载,支持拦截器和自定义转换器。但是它不支持GIF动画,而且在内存不足时会出现卡顿现象。
以下是一个简单的使用案例:

import okhttp3.*;public class MainActivity extends AppCompatActivity {private final OkHttpClient client = new OkHttpClient();@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);String url = "https://www.baidu.com/s?wd=java";Request request = new Request.Builder().url(url).build();client.newCall(request).enqueue(new Callback() {@Overridepublic void onFailure(Call call, IOException e) {Log.e("MainActivity", "Request failed", e);}@Overridepublic void onResponse(Call call, Response response) throws IOException {if (response.isSuccessful()) {final String myResponse = response.body().string();runOnUiThread(new Runnable() {@Overridepublic void run() {// Do something with the response string here}});} else {throw new IOException("Unexpected code " + response);}}});}
}

Retrofit

由Square公司出品的默认基于OkHttp封装的一套RESTful网络请求框架,通过注解直接配置请求,使用不同的http客户端和Json Converter来序列化数据,同时提供对RxJava的支持。
Retrofit是一个用于Android和Java平台的类型安全的网络请求框架。它通过将API抽象成Java接口而让我们连接到REST web服务变得很轻松。
以下是一个简单的使用案例:

public class MainActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);// Create an instance of Retrofit with a base URL and a converter factoryRetrofit retrofit = new Retrofit.Builder().baseUrl("https://api.example.com/").addConverterFactory(GsonConverterFactory.create()).build();// Create an interface for the API endpointsMyApiService service = retrofit.create(MyApiService.class);// Call the API endpoint and handle the responseCall<MyData> call = service.getMyData();call.enqueue(new Callback<MyData>() {@Overridepublic void onResponse(Call<MyData> call, Response<MyData> response) {if (response.isSuccessful()) {MyData data = response.body();// Do something with the data} else {// Handle the error response}}@Overridepublic void onFailure(Call<MyData> call, Throwable t) {// Handle the network failure}});}
}

FastAndroidNetworking

一款轻量级的网络请求框架,支持GET、POST、PUT、DELETE等多种请求方式,支持拦截器和自定义转换器。但是它的性能不如其他几个框架。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/796703.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

qt-C++笔记之QLabel加载图片

qt-C笔记之QLabel加载图片 —— 2024-04-06 夜 code review! 文章目录 qt-C笔记之QLabel加载图片0.文件结构1.方法一&#xff1a;把图片放在项目路径下&#xff0c;在 .pro 文件中使用 DISTFILES添加图片文件1.1.运行1.2.qt_test.pro1.3.main.cpp 2.方法二&#xff1a;不在 .pr…

院内感染的相关因素分析(Boruta联合SHAP分析2)R

院内感染的相关因素分析&#xff08;Boruta联合SHAP分析2&#xff09;R 和鲸社区一键运行代码 院内感染是指住院患者在医疗机构内发生的感染&#xff0c;是医院管理中常见且严重的问题。院内感染不仅会延长患者住院时间&#xff0c;增加医疗费用&#xff0c;还会严重威胁患者生…

vim美化配置(懒人版)

文章目录 配置vim&#xff08;懒人版&#xff09;1.搜索资源2.安装3.自定义缩进4.卸载方法 配置vim&#xff08;懒人版&#xff09; 1.搜索资源 打开gitee&#xff0c;注意到上面的搜索框 搜索 vimforcpp 进入&#xff0c;找到安装方法中的链接 2.安装 复制粘贴到linux中的命…

Windows IIS搭建FTP服务器、FTP用户隔离、Serv-U搭建FTP服务器

一、搭建FTP服务器 Server: 新建文件夹bbb&#xff0c;里面存放两个文件 Client: &#xff08;1&#xff09;通过资源管理器访问FTP &#xff08;2&#xff09;DOS命令访问FTP 下载bbb..txt 上传aaa.txt文件 查看上传情况 二、通过IIS服务中的FTP实现隔离用户 Server&#x…

doccano标注工具|为机器学习建模做数据标注

目录 一、标记流程 二、配置环境 2.1 安装 2.2 运行doccano 三、案例 3.1 创建项目 3.2 上传数据 3.3 定义标签 3.4 添加成员 3.5 开始标注 3.6 导出数据 3.7 导出数据 doccano doccano是开源的数据…

java小作业(5)--编写一个三角形类(第一遍)

1.题目&#xff1a; 2.代码&#xff1a; public class Xain{ //定义类名&#xff0c;要与文件.class名字一样private double yibian; //封装private double erbian;private double sanbian;public Xain(double yibian,double erbian,double sanbian){ //初始化…

分享three.js实现乐高小汽车

前言 Web脚本语言JavaScript入门容易&#xff0c;但是想要熟练掌握却需要几年的学习与实践&#xff0c;还要在弱类型开发语言中习惯于使用模块来构建你的代码&#xff0c;就像小时候玩的乐高积木一样。 应用程序的模块化理念&#xff0c;通过将实现隐藏在一个简单的接口后面&a…

Azkaban集群模式部署详细教程

序言 Azkaban是一个用于工作流程调度和任务调度的开源工具&#xff0c;它可以帮助用户轻松地管理和监控复杂的工作流程。Azkaban的架构设计旨在提供高度可扩展性和可靠性&#xff0c;同时保持易用性和灵活性。 Azkaban的架构可以分为三个主要组件:Executor、Web Server和db数据…

【力扣】94. 二叉树的中序遍历、144. 二叉树的前序遍历、145. 二叉树的后序遍历

先序遍历&#xff1a;根-左-右中序遍历&#xff1a;左-根-右后序遍历&#xff1a;左-右-根 94. 二叉树的中序遍历 题目描述 给定一个二叉树的根节点 root &#xff0c;返回 它的 中序 遍历 。 示例 1&#xff1a; 输入&#xff1a;root [1,null,2,3] 输出&#xff1a;[1,3…

Linux:五种IO模型的基本认识

文章目录 IO的本质五种IO模型异步和同步 阻塞IO非阻塞IO信号驱动IO IO的本质 在之前的内容中已经结束了对于网络和操作系统的学习&#xff0c;那么回过来再继续看IO&#xff0c;什么是IO呢&#xff1f; 对于网络的学习当中&#xff0c;实际上也是一种IO&#xff0c;数据从计算…

使用vite创建一个react18项目

一、vite是什么&#xff1f; vite 是一种新型前端构建工具&#xff0c;能够显著提升前端开发体验。它主要由两部分组成&#xff1a; 一个开发服务器&#xff0c;它基于原生 ES 模块提供了丰富的内建功能&#xff0c;如速度快到惊人的模块热更新&#xff08;HMR&#xff09;。 …

博客部署004-centos安装mysql及redis

1、如何查看当前centos版本&#xff1f; cat /etc/os-release 2、安装mysql 我的是centos8版本&#xff0c;使用dnf命令 2.1 CentOS 7/8: sudo yum install -y mysql-community-server 或者在CentOS 8上&#xff0c;使用DNF:&#x1f31f; sudo dnf install -y mysql-ser…

探秘MIMO技术:无线通信革命的多天线奇迹

单根发射天线和单根接收天线之间的信道容量受限于香农公式&#xff0c;要想在相同的频谱带宽下进一步提高信道容量&#xff0c;要采用多天线技术。 1. 什么是MIMO MIMO&#xff1a;Multiple-Input Multiple-Output&#xff0c;即多入多出系统。这里的入和出是相对于发射天线和…

力控机器人原理及力控制实现

力控机器人原理及力控制实现 力控机器人是一种能够感知力量并具有实时控制能力的机器人系统。它们可以在与人类进行精准协作和合作时&#xff0c;将力传感技术&#xff08;Force Sensing Technology&#xff09;和控制算法&#xff08;Control Algorithm&#xff09;结合起来&a…

Vue3_2024_7天【回顾上篇watch常见的后两种场景】

随笔&#xff1a;这年头工作不好找咯&#xff0c;大家有学历提升的赶快了&#xff0c;还有外出人多注意身体&#xff0c;没错我在深圳这边阳了&#xff0c;真的绝啊&#xff0c;最尴尬的还给朋友传染了&#xff01;&#xff01;&#xff01; 之前三种的监听情况&#xff0c;监听…

LabVIEW太赫兹波扫描成像系统

LabVIEW太赫兹波扫描成像系统 随着科技的不断发展&#xff0c;太赫兹波成像技术因其非电离性、高穿透性和高分辨率等特点&#xff0c;在生物医学、材料质量无损检测以及公共安全等领域得到了广泛的应用。然而&#xff0c;在实际操作中&#xff0c;封闭性较高的信号采集软件限制…

dm8数据迁移工具DTS

dm8数据迁移工具DTS DTS工具介绍 DM数据迁移工具提供了主流大型数据库迁移到DM、DM到DM、文件迁移到DM以及DM迁移到文件的功能。DM数据迁移工具采用向导方式引导用户通过简单的步骤完成需要的操作。 DM数据迁移工具支持&#xff1a; ◆ 主流大型数据库Oracle、SQLServer、MyS…

DC9 Debian和sql注入

信息收集 sudo arp-scan -l 列出局域网主机 arp-scan向局域网中所有可能的ip地址发出arp请求包&#xff0c;如果得到arp回应&#xff0c;就证明局域网中某台主机使用了该ip dc9的ip &#xff1a; 192.168.146.133 访问网页 cms为Debian 端口扫描 22端口是filtered 隐藏目…

详细分析Python爬虫中的xpath(附Demo)

目录 前言1. 基本知识2. 常用API3. 简易Demo 前言 关于爬虫的基本知识推荐阅读&#xff1a;Python爬虫从入门到应用&#xff08;超全讲解&#xff09; 该知识点需要提前安装相关依赖&#xff1a;pip install lxml 1. 基本知识 XPath&#xff08;XML Path Language&#xf…

GIt 删除某个特定commit

目的 多次commit&#xff0c;想删掉中间的一个/一些commit 操作方法 一句话说明&#xff1a;利用rebase命令的d表示移除commit的功能&#xff0c;来移除特定的commit # 压缩这3次commit,head~3表示从最近1次commit开始&#xff0c;前3个commit git rebase -i head~3rebase…