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.rhkb.cn/news/299202.html

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

相关文章

Mybatis--TypeHandler使用手册

TypeHandler使用手册 场景&#xff1a;想保存user时 teacher自动转String &#xff0c;不想每次保存都要手动去转String&#xff1b;从DB查询出来时&#xff0c;也要自动帮我们转换成Java对象 Teacher Data public class User {private Integer id;private String name;priva…

C++设计模式:策略模式(二)

1、定义与动机 定义一系列算法&#xff0c;把它们一个个封装起来&#xff0c;并且使它们可互相替换&#xff08;变化&#xff09;&#xff0c;该模式使得算法可独立于使用它的客户程序&#xff08;稳定&#xff09;而变化&#xff08;扩展&#xff0c;子类化&#xff09; 在软…

web安全学习笔记(6)

记一下第十节课的内容。 一.PHP语言中的if else判断 语法和c语言中非常类似&#xff0c;不再赘述&#xff0c;也可以使用if...elseif...elseif...else 1.True和False 2.&#xff0c;和 一个等号是赋值 两个等号是比较 三个等号是全等&#xff08;内容相等&#xff0c;数…

OpenHarmony开发-系统烧录

本文详细介绍了烧录OpenHarmony系统到开发板的操作流程。从基础的硬件准备和软件环境设置入手&#xff0c;详细说明了如何配置开发环境、构建系统镜像等过程&#xff0c;详细描述了烧录过程中的关键步骤&#xff0c;以及如何使用专用工具将OpenHarmony系统镜像传输到开发板。同…

第十四届蓝桥杯大赛软件赛省赛

第十四届蓝桥杯大赛软件赛省赛 2.日期统计 小蓝现在有一个长度为 100 的数组&#xff0c;数组中的每个元素的值都在 0 到 9 的范围之内。 数组中的元素从左至右如下所示&#xff1a; 5 6 8 6 9 1 6 1 2 4 9 1 9 8 2 3 6 4 7 7 5 9 5 0 3 8 7 5 8 1 5 8 6 1 8 3 0 3 7 9 2 7 …

PyQt6实战6--高亮

PyQt6实战3--sql查询器-CSDN博客 在sql查询器的基础上添加了sql语法的高亮 运行效果&#xff1a; 代码&#xff1a; 只需要在原来的代码上添加一行 rightTopLayout QVBoxLayout()rightTopLayout.addWidget(QLabel("输入sql:"))self.sql QTextEdit() #加一行高亮&…

【踩坑日记】因不同系统换行符不同导致的文本读取结果不同的问题

文章目录 1 问题现象描述2 解决过程&#xff08;点击直接跳到解决方法&#xff09;3 原因解释4 如何避免踩坑4.1 格式转换4.2 格式查看 1 问题现象描述 起因是群友问了这么一个问题 确实很奇怪&#xff0c;按理说第二个printf不会完全不输出&#xff0c;于是想到&#xff0c;…

多线程学习-线程池

目录 1.线程池的作用 2.线程池的实现 3.自定义创建线程池 1.线程池的作用 当我们使用Thread的实现类来创建线程并调用start运行线程时&#xff0c;这个线程只会使用一次并且执行的任务是固定的&#xff0c;等run方法中的代码执行完之后这个线程就会变成垃圾等待被回收掉。如…

7.二叉树的遍历方式及二叉树习题

4.二叉树链式结构的实现 二叉树是&#xff1a; 空树 非空&#xff1a;根节点&#xff0c;根节点的左子树、根节点的右子树组成的。 4.1二叉树的遍历 4.2.1 前序、中序以及后序遍历 前序遍历(Preorder Traversal 亦称先序遍历)——访问根结点的操作发生在遍历其左右子树之前…

161 Linux C++ 通讯架构实战15,线程池代码分析

线程池应该使用的地方 和 epoll 技术结合 线程池代码处理数据的地方。 线程池分析&#xff1a; 线程池代码1 threadpool_create //Tencent8888 start threadpool_create函数的目的初始化线程池&#xff0c;对应的struct是 threadpool_t /* 1.先malloc整个线程池的大小 2.这里…

Memcached 教程之 PHP 连接 Memcached 服务(十)

PHP 连接 Memcached 服务 在前面章节中我们已经介绍了如何安装 Memcached 服务&#xff0c;接下来我们为大家介绍 PHP 如何使用 Memcached 服务。 PHP Memcache 扩展安装 PHP Memcache 扩展包下载地址&#xff1a;PECL :: Package :: memcache&#xff0c;你可以下载最新稳定…

Vuex(vue 项目中实现 频繁、大范围数据共享的技术方案)

参考文档(点击查看) 好处 1.数据的存取一步到位&#xff0c;不需层层传递 2.数据的流动非常清晰 3.存储在Vuex中的数据都是响应式的&#xff08;数据更新后&#xff0c;使用数据的组件都会自动更新&#xff09; Vuex基础配置 npm i vuex3.6.2state中用来存储数据&#xff0c…

2_5.Linux存储的基本管理

实验环境&#xff1a; 系统里添加两块硬盘 ##1.设备识别## 设备接入系统后都是以文件的形式存在 设备文件名称&#xff1a; SATA/SAS/USB /dev/sda,/dev/sdb ##s SATA, dDISK a第几块 IDE /dev/hd0,/dev/hd1 ##h hard VIRTIO-BLOCK /de…

BPMNJS 在原生HTML中的引入与使用

BPMNJS 在HTML中的引入与使用 在网上看到的大多是基于vue使用BPMN的示例或者教程&#xff0c;竟然没有在HTML使用的示例&#xff0c;有也是很简单的介绍核心库的引入和使用&#xff0c;并没有涉及到扩展库。于是简单看了下&#xff0c;真的是一波三折&#xff0c;坎坎坷坷。不…

Linux:权限篇

文章目录 前言1.用户2.文件的权限管理2.1 修改文件的权限2.2 修改文件的拥有者2.3 修改文件的所属组 3.file指令4.umask指令4.目录的权限管理总结 前言 Linux权限在两个地方有所体现&#xff0c;一种是使用用户&#xff1a;分为root超级用户员与普通用户。另一个是体现在文件的…

在Java中对SQL进行常规操作的通用方法

SQL通用方法 一、常规方法增删改查二、具体优化步骤1.准备工作2.getcon()方法&#xff0c;获取数据库连接对象3.closeAll()方法&#xff0c;关闭所有资源4.通用的增删改方法5.通用的查询方法6.动态查询语句 总结 一、常规方法增删改查 在常规方法中&#xff0c;我们在Java中对…

数据库排错记录

目录 一、 规范二、 优化查询1) 通过执行计划 三、 排查故障1) 网络断连2) 超时登录已断开3) 死锁4) 实例错误 一、 规范 尽量不要用select *&#xff0c;select 语句最好加上with(nolock)数据量大的表必须要有主键&#xff0c;可以是自增ID查询语句的条件里面的字段&#xff…

勒索病毒最新变种.rmallox勒索病毒来袭,如何恢复受感染的数据?

导言&#xff1a; 随着信息技术的飞速发展&#xff0c;网络安全问题日益突出&#xff0c;其中勒索病毒便是近年来备受关注的网络安全威胁之一。在众多勒索病毒中&#xff0c;.rmallox勒索病毒以其独特的传播方式和强大的加密能力&#xff0c;给广大用户带来了极大的困扰。本文…

11-pyspark的RDD的变换与动作算子总结

目录 前言 变换算子动作算子 前言 一般来说&#xff0c;RDD包括两个操作算子&#xff1a; 变换&#xff08;Transformations&#xff09;&#xff1a;变换算子的特点是懒执行&#xff0c;变换操作并不会立刻执行&#xff0c;而是需要等到有动作&#xff08;Actions&#xff09;…

索引的概念

索引的概念    1.索引是一种可选的与表相关的数据库对象&#xff0c;用于提高数据的查询效率。    2.索引是一种有序的数据结构。    3.如果一个表没有创建索引&#xff0c;则对该表进行查询时需要进行全表扫描&#xff1b;如果创建了索引&#xff0c;则在有条件查询时…