Android 的网络加载

news2024/11/19 22:38:30

发起网络请求的过程

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

  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 result
        System.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;

    @Override
    protected 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>() {
            @Override
            public void onResponse(String response) {
                Log.d(TAG, response);
            }
        }, new Response.ErrorListener() {
            @Override
            public 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();

    @Override
    protected 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() {
            @Override
            public void onFailure(Call call, IOException e) {
                Log.e("MainActivity", "Request failed", e);
            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {
                if (response.isSuccessful()) {
                    final String myResponse = response.body().string();
                    runOnUiThread(new Runnable() {
                        @Override
                        public 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 {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // Create an instance of Retrofit with a base URL and a converter factory
        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl("https://api.example.com/")
                .addConverterFactory(GsonConverterFactory.create())
                .build();

        // Create an interface for the API endpoints
        MyApiService service = retrofit.create(MyApiService.class);

        // Call the API endpoint and handle the response
        Call<MyData> call = service.getMyData();
        call.enqueue(new Callback<MyData>() {
            @Override
            public 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
                }
            }

            @Override
            public void onFailure(Call<MyData> call, Throwable t) {
                // Handle the network failure
            }
        });
    }
}

FastAndroidNetworking

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

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

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

相关文章

Flutter 解决NestedScrollView与TabBar双列表滚动位置同步问题

文章目录 前言一、需要实现的效果如下二、flutter实现代码如下&#xff1a;总结 前言 最近写flutter项目&#xff0c;遇到NestedScrollView与TabBar双列表滚动位置同步问题&#xff0c;下面是解决方案&#xff0c;希望帮助到大家。 一、需要实现的效果如下 1、UI图&#xff1…

程序汪5万接的公交车板打车小程序,开发周期40天(发布版

本项目来自程序汪背后的私活小团队&#xff0c;开发了一个打车小程序&#xff0c;给粉丝分享一下解决方案&#xff0c;本项目前端工作量比较大&#xff0c;希望给想接私活的朋友一些经验参考 视频版本 在 B站【我是程序汪】 目录 一、项目构成 二、开发人员 三、项目背景 四…

Redis数据库的入门学习

关系型数据库和非关系型数据库的区别&#xff1a; 简介 Redis数据库和MySql数据库的区别&#xff1a;Redis数据库是基于内存的key-value结构的数据库。本质上是内存存储。 而MySql数据库是通过数据文件的方式存在磁盘当中&#xff0c;本质上是磁盘存储。且MySql当中是通过二维…

2-3多交换机静态流表控制原理与实现

实现目标环境下的静态流表设置&#xff1a; 1 单个ovs上实现多个主机hosts之间的通信 2多ovs上多主机之间的通信 1 单个ovs上实现多个主机hosts之间的通信 使用函数定义的方式创建一个如下的拓扑&#xff0c;并使用静态流表 from mininet.net import Mininet from mininet.n…

ENSP防火墙,解决不兼容及报错等问题,windows命令行修改网卡配置,配置cloud及防火墙连接,web连接防火墙

解决不兼容和报错等问题 原因1&#xff1a;VirtualBox版本太低&#xff08;5.1.x&#xff09;或太高&#xff08;6.x.x&#xff09;和eNSP不兼容 卸载virtualbox&#xff0c;下载virtualbox 5.2.28&#xff0c;安装稳定版本的virtualbox 删除原有程序&#xff1a;c:\用户\***\.…

Qt报错:C1083 无法打开包括文件: No such file or directory

我用的是VS2019 添加了一个继承自QTextEdit 的新类QMsgTextEdit, 就出现了这样的报错&#xff1a; 我双击ui_TalkWindow.h, 打开这个文件后, 发现&#xff1a; 我就试着打开qmsgtextedit.h&#xff0c;发现&#xff1a; 于是&#xff0c;我就在当前ui_TalkWindow.h文件的目…

数据可视化-地图可视化-Python

师从黑马程序员 基础地图使用 基础地图演示 视觉映射器 具体颜色对应的代码可以在http://www.ab173.com/中查询RGB颜色查询对照表 from pyecharts.charts import Map from pyecharts.options import VisualMapOpts#准备地图对象 mapMap() #准备数据 data[("北京",…

数据结构学习——栈和队列

1.栈 1.1栈的概念及结构 栈&#xff1a;一种特殊的线性表&#xff0c;其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端 称为栈顶&#xff0c;另一端称为栈底。栈中的数据元素遵守后进先出LIFO&#xff08;Last In First Out&#xff09;的原则。 …

YOLOv5实战记录05 Pyside6可视化界面

个人打卡&#xff0c;慎看。 指路大佬&#xff1a;【手把手带你实战YOLOv5-入门篇】YOLOv5 Pyside6可视化界面_哔哩哔哩_bilibili 零、虚拟环境迁移路径后pip报错解决 yolov5-master文件夹我换位置后&#xff0c;无法pip install了。解决如下&#xff1a; activate.bat中修改…

关系型数据库与非关系型数据库、Redis数据库

相比于其他的内存/缓存数据库&#xff0c;redis可以方便的实现持久化的功能&#xff08;保存至磁盘中&#xff09; 一、关系数据库与非关系型数据库 1.1 关系型数据库 一个结构化的数据库&#xff0c;创建在关系模型基础上一般面向于记录 SQL语句 (标准数据查询语言) 就是一种…

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

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

大语言模型落地的关键技术:RAG

1、什么是RAG&#xff1f; RAG 是检索增强生成&#xff08;Retrieval-Augmented Generation&#xff09;的简称&#xff0c;是当前最火热的大语言模型应用落地的关键技术&#xff0c;主要用于提高语言模型的效果和准确性。它结合了两种主要的NLP方法&#xff1a;检索&#xff…

【智能排班系统】AOP实现操作日志自动记录

文章目录 操作日志介绍自动保存操作日志基本实现思路定义注解枚举业务类型枚举操作人员类型枚举 AOP具体实现方法上添加注解 日志增删改查日志表sql实体类ServiceControllerVo 操作日志介绍 操作日志是对系统或应用程序中所有用户操作、系统事件、后台任务等进行详细记录的文本…

代码随想录算法训练营Day46|LC139 单词拆分

一句话总结&#xff1a;完全背包&#xff01; 原题链接&#xff1a;139 单词拆分 动态规划之完全背包五部曲&#xff1a; 确定dp数组与下标含义&#xff1a;表示字符串长度为i时&#xff0c;dp[i] true 的话&#xff0c;可以拆分为一个或多个在字典中出现的单词。确定递归公…

贪心算法|122.买卖股票的最佳时机II

力扣题目链接 class Solution { public:int maxProfit(vector<int>& prices) {int result 0;for (int i 1; i < prices.size(); i) {result max(prices[i] - prices[i - 1], 0);}return result;} }; 贪心思路出来了&#xff0c;代码居然如此简单啊&#xff0…

16.Python多线程

如果想让我们的程序同时执行多个任务&#xff0c;就需要使用多线程技术了 。到目前为止&#xff0c;我们编写的程序都是单线程的&#xff0c;在运行时一次只能执行 一个任务。 1 线程相关的知识 1.1 进程 一个进程就是一个正在执行的程序&#xff0c;每一个进程都有自己独立…

软考高级架构师:嵌入式处理器体系结构

一、AI 讲解 嵌入式处理器体系结构中&#xff0c;冯诺依曼结构和哈佛结构是两种最基本的设计模式&#xff0c;它们各有特点和典型应用场景。 结构定义特点典型应用冯诺依曼结构一种将程序存储器和数据存储器合并在同一存储器中的计算机体系结构。这意味着指令和数据共享同一个…

基于javassm实现的水果销售管理网站

开发语言&#xff1a;Java 框架&#xff1a;ssm 技术&#xff1a;JSP JDK版本&#xff1a;JDK1.8 服务器&#xff1a;tomcat7 数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09; 数据库工具&#xff1a;Navicat11 开发软件&#xff1a;eclipse/myeclip…

【C++航海王:追寻罗杰的编程之路】C++的类型转换

目录 1 -> C语言中的类型转换 2 -> 为什么C需要四种类型转换 3 -> C强制类型转换 3.1 -> static_cast 3.2 -> reinterpret_cast 3.3 -> const_cast 3.4 -> dynamic_cast 4 -> RTTI 1 -> C语言中的类型转换 在C语言中&#xff0c;如果赋值运…

【攻防世界】FlatScience

dirsearch 扫描发现四个文件 在login.php 中发现 输入 http://61.147.171.105:61912/login.php/?debug 发现源码 <?php if(isset($_POST[usr]) && isset($_POST[pw])){$user $_POST[usr];$pass $_POST[pw];$db new SQLite3(../fancy.db);$res $db->query(…