传送门

《一、Android Studio的安装和使用》
《二、Android界面开发》
《三、Android网络开发》
《四、狗狗大全应用实战》

视频教程

https://space.bilibili.com/249229063/channel/seriesdetail?sid=1930119

学习目标

  • 了解HTTP
  • OKHttp的使用
  • 网络数据解析

HTTP

维基百科:https://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol

HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写,是用于从万维网(WWW: World Wide Web)服务器传输超文本到本地浏览器的传送协议。这里说的超文本,就是用超链接的方法,将各种不同空间的文字信息组织在一起的网状文本,可以理解成网页。所以,HTTP实际上就是一个规则,服务器和终端按照这套规则进行数据传输和解析。那这个规则是怎样的呢?这个规则主要定义了HTTP请求的数据结构和HTTP响应的数据结构。

HTTP请求

一个HTTP请求到服务器的请求消息包括以下格式:请求行(request line)、请求头部(header)、空行和请求数据四个部分组成。请求数据部分可以没有,但其余部分必须有,例如:

-- 请求行,包括请求方法(这里为GET),URL(这里为/),协议版本(这里为HTTP/1.1)
GET / HTTP/1.1
-- 请求头部
Host: www.example.com
User-Agent: Mozilla/5.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Language: en-GB,en;q=0.5
Accept-Encoding: gzip, deflate, br
Connection: keep-alive
-- 空行

HTTP响应

HTTP响应也由四个部分组成,分别是:状态行、消息报头、空行和响应正文。

-- 状态行
HTTP/1.1 200 OK
-- 消息报头
Date: Mon, 23 May 2005 22:38:34 GMT
Content-Type: text/html; charset=UTF-8
Content-Length: 155
Last-Modified: Wed, 08 Jan 2003 23:11:55 GMT
Server: Apache/1.3.3.7 (Unix) (Red-Hat/Linux)
ETag: "3f80f-1b6-3e1cb03b"
Accept-Ranges: bytes
Connection: close
-- 空行-- 响应正文
<html><head><title>An Example Page</title></head><body><p>Hello World, this is a very simple HTML document.</p></body>
</html>

另外,通过HTTP协议传输的不一定是网页,还有其他的数据结构。例如,在浏览器中输入URL:https://api.github.com/users/uncleleonfan ,返回的结果是这种键值对形式的数据,我们称之为JSON数据:

{"login": "uncleleonfan","id": 8477402,"node_id": "MDQ6VXNlcjg0Nzc0MDI=","avatar_url": "https://avatars.githubusercontent.com/u/8477402?v=4","gravatar_id": "","url": "https://api.github.com/users/uncleleonfan","html_url": "https://github.com/uncleleonfan","followers_url": "https://api.github.com/users/uncleleonfan/followers","following_url": "https://api.github.com/users/uncleleonfan/following{/other_user}","gists_url": "https://api.github.com/users/uncleleonfan/gists{/gist_id}","starred_url": "https://api.github.com/users/uncleleonfan/starred{/owner}{/repo}","subscriptions_url": "https://api.github.com/users/uncleleonfan/subscriptions","organizations_url": "https://api.github.com/users/uncleleonfan/orgs","repos_url": "https://api.github.com/users/uncleleonfan/repos","events_url": "https://api.github.com/users/uncleleonfan/events{/privacy}","received_events_url": "https://api.github.com/users/uncleleonfan/received_events","type": "User","site_admin": false,"name": "Leon Fan","company": null,"blog": "","location": null,"email": null,"hireable": null,"bio": null,"twitter_username": null,"public_repos": 104,"public_gists": 0,"followers": 298,"following": 2,"created_at": "2014-08-18T08:14:59Z","updated_at": "2021-12-19T07:16:30Z"
}

OKHttp

Github: https://github.com/square/okhttp

OKhttp是一个开源的网络库,它封装了Http请求和响应的方法,使用它,我们可以在Android应用中轻松的发送HTTP请求和获取HTTP响应。

使用方法:

1、给应用添加网络权限
如果Android应用要使用网络,需要在AndroidManifest.xml中声明使用网络的权限。

如果不声明网络权限,后续会在调用网络的过程中抛出权限异常:

E/AndroidRuntime: FATAL EXCEPTION: OkHttp DispatcherProcess: com.xuneng.helloworld, PID: 28405java.lang.SecurityException: Permission denied (missing INTERNET permission?)at java.net.Inet6AddressImpl.lookupHostByName(Inet6AddressImpl.java:150)at java.net.Inet6AddressImpl.lookupAllHostAddr(Inet6AddressImpl.java:103)at java.net.InetAddress.getAllByName(InetAddress.java:1152)at okhttp3.Dns$Companion$DnsSystem.lookup(Dns.kt:49)

2、添加Okhttp的依赖

找到项目app模块下的build.gradle, 添加对Okttp的依赖,并点击Sync Now同步按钮,下载OKhttp库。

3、发送请求

在MainActivity.java中创建发送请求到方法sendRequest()。

需要注意的是,在Android中,网络请求是耗时的IO操作,需要放到子线程中,主线程(UI线程)只做UI操作。通过enqueue的方法,网络请求将会在子线程中执行。
sendRequest方法完成后,就可以在MainActivity中的onCreate方法里调用,发起网络请求。

运行代码,如果请求成功,会执行的回调方法onResponse,打印出日志:

运行代码到模拟器前,可以检查下模拟器是否能够正常访问,方法是将URL https://api.github.com/users/uncleleonfan 复制粘贴到模拟器的浏览器,看是否能正常返回数据。如果模拟器不能正常返回,可以搜索下怎么解决模拟器网络问题,或者直接用电脑连Android手机,开启USB调试模式,将代码运行到真机上。

网络数据解析

OKhttp网络请求返回的是一个Response对象,怎么去解析这个Response对象,获取到我们要的数据呢?上面我们提到请求https://api.github.com/users/uncleleonfan 返回的是一个JSON数据格式,所以我们这里使用JSONObject来解析。

代码执行后的日志:

三、Android网络开发相关推荐

  1. Android网络开发技术实战详解

    <Android网络开发技术实战详解> 基本信息 作者: 朱桂英 丛书名: Android移动开发技术丛书 出版社:电子工业出版社 ISBN:9787121173493 上架时间:2012 ...

  2. 《Android 网络开发与应用实战详解》——1.3节搭建Android应用开发环境

    本节书摘来自异步社区<Android 网络开发与应用实战详解>一书中的第1章,第1.3节搭建Android应用开发环境,作者 王东华,更多章节内容可以访问云栖社区"异步社区&qu ...

  3. 《Android 网络开发与应用实战详解》——2.3节Android系统架构

    本节书摘来自异步社区<Android 网络开发与应用实战详解>一书中的第2章,第2.3节Android系统架构,作者 王东华,更多章节内容可以访问云栖社区"异步社区"公 ...

  4. 《Android 网络开发与应用实战详解》——2.1节简析Android安装文件

    本节书摘来自异步社区<Android 网络开发与应用实战详解>一书中的第2章,第2.1节简析Android安装文件,作者 王东华,更多章节内容可以访问云栖社区"异步社区" ...

  5. android 网络开发相关资料

    网络编程汇总: 1. http 基础知识和编程 http://www.jianshu.com/p/99dc1f8f62bf 2. socket  udp  tcp 区别与联系 http://jingy ...

  6. android 无网络处理布局,Android网络开发

    1. WebView用法 ①布局文件新建一个WebView,特别注意线性布局和控件的宽高都要匹配父控件 xmlns:tools="http://schemas.android.com/too ...

  7. Android网络开发

    1. WebView用法 ①布局文件新建一个WebView,特别注意线性布局和控件的宽高都要匹配父控件 <LinearLayout xmlns:android="http://sche ...

  8. Android网络开发(一、Socket通信HTTP通信)

    一.Socket通信   Socket:即套接字,其本身并不是一种通信协议,它是封装了TCP/IP.UDP 协议的API实现.在创建Socket对象后,底层会完成TCP/IP的三次握手等(UDP协议对 ...

  9. android 网络开发

    反复研究了 Android Market,总结一下,之前发在新浪微博上,但不够详细,主要是提高用户体验. 1.网络异常处理,重试机制. 上wifi常常网络断开,那就看运用程序是否健壮.可以用Andro ...

最新文章

  1. java ee eclipse idea,转----从Eclipse转移到IntelliJ IDEA一点心得
  2. 华为亮度自动调节没了_一加8T不止有8192级自动亮度调节 刘作虎在线种草
  3. JSP与mysql的连接
  4. visio 形状_分享我Visio经验(问题从来都不是问题)
  5. java 时钟 算法分析_java实现时钟方法汇总
  6. mysql 检查点_my05_mysql检查点简述
  7. android so文件崩溃,android 7.0 因为.so文件而崩溃事件解决
  8. 点对点借贷dApp Yield宣布流动性激励迁移至SushiSwap
  9. ImageJ的自动二值算法C++实现
  10. 做管理,“重人情”还是“重制度”?
  11. python分支结构、循环结构
  12. 【百战GAN】如何使用GAN给黑白老照片上色?
  13. Android常用的第三方支付(支付宝、微信、银联)
  14. vue无法加载文件C:\Users\Administrator\AppData\Roaming\npm\vue.ps1因为在此系统上禁止运行脚本……解决办法
  15. 算法与数据结构实验题 5.18 小孩的游戏
  16. Law of continuity
  17. 计算机专业如何自己增加项目经验?
  18. 大学计算机打开文件过程演示实验记录表,操作系统进程与文件管理 实验报告表 作业 5.doc...
  19. 六大布局之线性布局详解
  20. 焦深(depth of focus)

热门文章

  1. 计算机win键在哪,Windows键是哪个?电脑上的Win键在哪里? [图片和文字]
  2. 什么是信号完整性?(大白话)
  3. 在大学里计算机专业总分多少,计算机专业高考多少分录取?附中国计算机专业大学排名及分数线...
  4. 中国社交产品十年记....
  5. NRF52832 SPI 资料收集
  6. 递归算法删除某一链表指定节点为什么不会发生断链?(解析原因)
  7. 计算机组装考核记录表,计算机组装与维护考核方案(必修).doc
  8. 移动端web和PC端web的区别汇总笔记
  9. Vue设置浏览器title-icon
  10. Linux man指令查询文档设定成中文