WebView以及使用HTTP访问访问网络

news2024/12/26 22:50:46

文章目录

  • 使用网络技术
    • WebView的用法
    • 使用HTTP访问网络
      • 使用HttpURLConnection
      • 使用OkHttp

使用网络技术

  • 在Android开发当中,我们应该合理的使用网络编写出更加出色的应用程序,下面学习以下如何在手机端使用HTTP和服务器进行网络交互,并对服务器返回的数据进行解析,这也是在Android当中最常用到的网络技术

WebView的用法

  • 在开发的过程中有时候我们会遇到一些比较特殊的需求,比如说是要在应用程序当中展示一些网页,但是通常来说加载和显示到网页是浏览器应该做的事情,但是在需求当中又不允许我们打开浏览器,我们不可能自己去写一个浏览器出来,这时候应该怎么办呢?
  • 其实Android早就考虑到了这种特殊的需求,给开发人员提供了一个WebView控件,借助这个控件我们就可以在自己的应用程序当中嵌入一个浏览器,从而轻松的展示各种各样的网页.
  • 下面新建一个WebViewTest项目来使用一下这个控件的使用
  • 修改activity_main.xml文件当中的代码
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <WebView
        android:id="@+id/webView"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

</LinearLayout>
  • 可以看到在该文件当中只包含了一个WebView控件,这个空间就是用来显示网页的,这里的写法也比较简单,给它设置了一个id,然后让他充满了整个屏幕
  • 然后修改MainActivity当中的代码
class MainActivity : AppCompatActivity() {
    @SuppressLint("SetJavaScriptEnabled")
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        webView.settings.javaScriptEnabled = true
        webView.webViewClient = WebViewClient()
        webView.loadUrl("https://www.baidu.com")
    }
}
  • 上述代码也比较简单,通过WebView的getSettings()方法可以设置一些浏览器的属性,在这里调用了setJavaScriptEnabled()方法,让WebView支持JavaScript脚本
  • 接下来是比较重要的部分,调用了WebView的setWebViewClient()方法并且传入了一个WebViewClient()的实例,这段代码的作用是,当需要从一个网页跳转到另外一个网页的时候,我们希望目标网页仍然在当前WebView当中进行显示,而不是打开系统浏览器.
  • 最后一步就是调用了WebView的loadUrl()方法,并将网址传入,即可展示相应的网页内容
  • 另外需要注意的是,由于本程序使用了网络功能,需要在AndroidManifest.xml文件当中,加入网络权限声明
<uses-permission android:name="android.permission.INTERNET" />
  • 然后运行程序就可以看到我们打开了百度的网页

.

使用HTTP访问网络

  • HTTP协议的基本原理简单来说就是,客户端向服务器发送一条HTTP请求,服务器在收到请求之后会返回一些数据给客户端,然后客户端再对这些数据进行解析和处理就可以了,一个浏览器的基本原理其实也就是这样.
  • 在上述代码的WebView控件当中就是向百度的服务器发送了一条HTTP请求,接着服务器分析出我们想要访问的是百度的首页,接着把网页的HTML代码进行返回,然后WebView再调用手机浏览器内核对返回的HTML代码进行解析,最终将网页展示出来.
  • 简单来说,WebView已经在后台帮我们处理好了发送HTTP请求,接收服务器响应,解析返回的数据,以及最终的页面展示这几个步骤.

使用HttpURLConnection

  • 在过去Android发送HTTP请求的方式一般有两种:HttpURLConnection和HttpClient两种方式
  • 但是HttpClient存在API数量过多,扩展困难等问题,所以在Android6.0系统中HttpClient的功能被完全移除了
  • 下面看看官方推荐的HttpURLConnection的用法
  • 首先需要获取HttpURLConnection实例,一般只需要创建一个URL对象,并传入目标的网络地址,然后调用一下openConnection()方法即可,如下所示
val url = URL("Https://www.baidu.com")
val connection = url.openConnection() as HttpURLConnection
  • 在得到HttpURLConnection的实例之后,我们可以设置一下HTTP请求所使用的方法,常用的方法主要有:POST,GET
  • POST一般表示希望提交数据给服务器,GET一般表示从服务器获取数据
  • 写法如下:
connection.requestMethod = "GET"
  • 接下来可以进行一些自由的定制,比如设置连接超时,读取超时的毫秒数,以及服务器希望得到的一些消息头.这部分内容根据自己的实际情况进行编写,示例写法如下:
connection.connectTimeout = 8000
connection.readTimeout = 8000
  • 之后再调用getInputstream()方法就可以获取到服务器返回的输入流了,剩下的任务就是对输入流进行读取:
val input = connection.inputStream
  • 最后可以调用disconnect()方法,将这个HTTP连接进行关闭
connection.disconnect()
  • 下面新建一个NetworkTest项目,来体验一下HttpURLConnection的用法
  • 首先修改activity_main.xml文件中的代码
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <Button
        android:id="@+id/sendRequestBtn"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Send Request" />

    <ScrollView
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <TextView
            android:id="@+id/respondText"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />
    </ScrollView>


</LinearLayout>
  • 在这里面我们主要使用了一个新的控件ScrollView,因为由于手机屏幕比较小,有时候过多的内容显示不下,借助ScrollView控件就可以通过滚动屏幕的方式来查看屏幕以外的内容了

  • 另外还有一个按钮和一个TextView,分别用来发送HTTP请球和显示服务器返回的数据的

  • 现在写MainActivity当中的代码来编写具体的逻辑

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        sendRequestBtn.setOnClickListener {
            sendRequestWithHttpURLConnection()
        }
    }

    private fun sendRequestWithHttpURLConnection() {
        //开启线程发起网络请求
        thread {
            var connection: HttpURLConnection? = null
            try {
                val response = StringBuilder()
                val url = URL("https://www.baidu.com")
                connection = url.openConnection() as HttpURLConnection
                connection.connectTimeout = 8000
                connection.readTimeout = 8000
                val input = connection.inputStream
                //下面对获取到的输入流进行读取
                val reader = BufferedReader(InputStreamReader(input))
                reader.use {
                    reader.forEachLine {
                        response.append(it)
                    }
                }
                showResponse(response.toString())
            } catch (e: Exception) {
                e.printStackTrace()
            } finally {
                connection?.disconnect()
            }
        }
    }

    private fun showResponse(response: String) {
        runOnUiThread {
            //在这里进行UI操作,将结果显示到界面上
            respondText.text = response
        }
    }
}
  • 在sendRequestWithHttpURLConnection()方法中,先开启了一个子线程,然后在这个子线程中先使用HttpURLConnection发出了一条HTTP请求,然后利用BufferReader对服务器返回的流进行读取,并将结果传入到showResponse()方法当中
  • 而在showResponse()方法中,调用了runOnUiThread()方法,之所以调用这个方法是因为,Android是不允许在子线程当中更新UI的,而这个方法是利用了异步消息处理机制,所以借助这个方法我们将服务器返回的数据更新到界面上
  • 最后还要再声明一下网络权限
<uses-permissi android:name="android.permission.INTERNET" />
  • 现在运行程序点击按钮就可以看到下面的这些数据

.

  • 可以看到服务器给我们返回的就是这种HTML代码,只不过浏览器可以将这些HTML代码解析渲染成为精美的网页
  • 上述是从服务器获取数据,加假如我们想要向服务器提交数据该怎么办?
  • 这时候我们可以使用POST方法,并在获取输入流之前将要提交的数据进行写出即可
  • 每条数据都要以键值对的形式存在,数据与数据之间使用"&"符号进行隔开,比如我们想要向服务器提交用户名和密码,我们可以这样写
connection.requestMethod = "POST"
val output = DataOutputStream(connection.outputStream)
output.writeBytes("username=admin&password=123456")

使用OkHttp

  • 在开源盛行的今天,除过HttpURLConnection,也并不是没有其他的选择,有许多出色的网络通信库都可以替代原生的HttpURLConnection,而OkHttp无疑是做的最出色的一个

  • OkHttp是Square公司开发的一款在接口封装上做的简单易用,就连底层也是自成一派,现在已经成为广大Android开发者首选的网络通信库

  • OkHttp的项目主页地址是:Http://github.com/square/okhttp

  • 在使用OkHttp之前我们需要现在项目当中添加OkHttp库的依赖

implementation("com.squareup.okhttp3:okhttp:4.10.0")

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yrwg3Y0d-1672297573695)(C:/Users/zhengbo/%E6%88%91%E7%9A%84%E5%AD%A6%E4%B9%A0/Typora%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/%E5%AE%89%E5%8D%93/image-20221225212110621.png)]

  • 添加上述依赖之后会自动下载两个库,一个是OkHttp库,一个Okio库,后者是前者的通信基础.
  • 使用OkHttp首先需要创建一个OkHttpClient实例,如下所示
val client = OkHttpClient()
  • 接下来如果想要发起一条HTTP请球,就需要创建一个Request对象:
val request = Request.Builder().build()
  • 上述代码是创建一了一个空的request对象,沃恩可以在最终的build()方法之前连缀很多个其他的方法来丰富这个Request对象,比如可以通过url()方法来设置目标网络地址,如下所示
val request = Request.Builder()
	.url("https://www.baidu.com")
	.build()
  • 之后调用OkHttpClient的newCall()方法来创建一个Call对象,并调用它的execute()方法,来发送请求并获取服务器返回的数据,写法如下:
val response = client.newCall(resquest).execute()
  • Response对象就是服务器返回的数据了,我们可以使用以下写法来的到返回的具体内容
val responseData = response.body?.string()
  • 如果我们要发起一条POST请求,会比GET请求稍微复杂一点,我们需要先构建Request Body对象来存放待提交的参数,如下所示:
val requestBody = FormBody.Builder()
	.add("username", "admin")
	.add("password", "123456")
	.build()
  • 然后在Request.Builder中调用一下post()方法,并将RequestBody对象传入
val request = Request.Builder()
	.url("https://www.baidu.com")
	.post(requestBody)
	.build()
  • 接下来的操作就和GET请求一样了.调用execute()方法来发送请求并获取服务器返回的数据即可
  • 在NetworkTest项目当中改用OkHttp的方式实现一遍
    private fun sendRequestWithOkHttp() {
        thread {
            try {
                val client = OkHttpClient()
                val request = Request.Builder()
                    .url("https://www.baidu.com")
                    .build()
                val response = client.newCall(request).execute()
                val responseData = response.body?.string()
                if (responseData != null) {
                    showResponse(responseData)
                }
            } catch (e: Exception) {
                e.printStackTrace()
            }
        }
    }
  • 该方法实现的效果和之前编写的sendRequestWithHttpURLConnection()方法实现的效果是一样的,但是在使用上还是简便了一些的.

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

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

相关文章

爽啊,这么多有趣好玩强大的 Python 库

Python语言简洁、易读以及可扩展&#xff0c;在国内外用 Python 做研究的非常多。 Python 语言向来以丰富的第三方库而闻名。这么多有趣好玩且强大&#xff0c;靠一个人去寻找太难了。 最近粉丝群小伙伴们又罗列了一些&#xff0c;分享给大家。喜欢记得点个赞&#xff0c;加入…

OpenHarmony#深入浅出学习eTs#(三)UI布局

本项目Gitee仓地址&#xff1a;深入浅出eTs学习: 带大家深入浅出学习eTs (gitee.com) 一、ArkUI介绍 框架介绍 方舟开发框架&#xff08;简称&#xff1a;ArkUI&#xff09;&#xff0c;是一套UI开发框架&#xff0c;提供开发者进行应用UI开发时所必需的能力。 基本概念 组…

力扣sql入门篇(二)

力扣sql入门篇(二) 1 计算特殊奖金 1.1 题目内容 1.1.1 基本题目信息 1.1.2 示例输入输出 1.2 示例sql语句 SELECT employee_id, case when employee_id%21 AND name not like "M%" then salary else 0 end bonus FROM Employees ORDER BY employee_id;1.3 运行…

【软件测试】测试人的一份“漂亮“的年终总结报告......

目录&#xff1a;导读前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09;前言 不管这一年&#xf…

举一反三-自建zabbix监控mysql

之前写过2篇zabbix监控redis的文章。 本篇针对的是mysql。除了描述如何创建mysql监控的步骤,本篇另一个目的是描述创建任意一个监控对象的基本原理,未来面对其它监控对象时,可以举一反三。 zabbix监控的最基本的部件时zabbix server和zabbix agent. zabbix server负责汇总…

c++primer 第4章 表达式

文章目录第4章 表达式4.1 基础4.1.1 基础概念4.1.2 优先级与结合律4.1.3 求值顺序4.2 算术运算符4.3 逻辑和关系运算符4.4 赋值运算符4.5 递增和递减运算符4.6 成员访问运算符4.7 条件运算符4.8 位运算符4.9 sizeof运算符4.10 逗号运算符4.11 类型转换4.11.1 算术转换4.11.2 其…

ES6-ES11笔记(1)

关于这个视频的笔记 (https://www.bilibili.com/video/BV1uK411H7on?p29&vd_source3cf72bb393b8cc11b96c6d4bfbcbd890) 1.ES6 1.1let的一些注意点 let a; let b,c,d; let e 100; let f"你好",g101;// 变量名不能重复声明 // let testDepulicate 123456 // …

无信息变量消除法研究及实现(Matlab代码实现)

目录 &#x1f4a5;1 概述 &#x1f4da;2 运行结果 &#x1f389;3 参考文献 &#x1f468;‍&#x1f4bb;4 Matlab代码 &#x1f4a5;1 概述 波长变量筛选的方法主要有相关系数法&#xff0c;逐步回归法&#xff0c;无信息变量消除法(UVE)&#xff0c;遗传算法(genetic …

python圣诞树词云

一、前言 圣诞节虽然是西方节日&#xff0c;但是个人还是比较喜欢的&#xff08;没有崇洋媚外的意思&#xff0c;中国的春节也超级棒&#xff09;&#xff0c;一个是圣诞节的氛围&#xff0c;圣诞节的圣诞老人等象征、雪花麋鹿等元素&#xff0c;都充满了浪漫的氛围。我想这也是…

Linux的文件系统编程(1)

What makes the desert beautiful is that somewhere it hides a well. 沙漠之所以美丽,是因为在它的某个角落隐藏着一口井. Linux的文件系统编程&#xff08;1&#xff09;运行过程框架标准IO和文件IO标准IO文件IO(主要学)open函数两个参数三个参数close函数read函数write函数…

Python基础语法(二)

Python基础语法&#xff08;二&#xff09; 函数 编程中的函数和数学中的函数有一定的相似之处. 数学上的函数, 比如 y sin x , x 取不同的值, y 就会得到不同的结果. 编程中的函数, 是一段 可以被重复使用的代码片段 . 代码示例: 求数列的和, 不使用函数 # 1. 求 1 - 100 …

树Tree【代码笔记】

树【Tree】 树是n&#xff08;n>0&#xff09;个结点的有限集。当n 0时&#xff0c;称为空树。在任意一棵非空树中应满足&#xff1a; 有且仅有一个特定的称为根的结点。当n>1时&#xff0c;其余节点可分为m&#xff08;m>0&#xff09;个互不相交的有限集T1,T2,……

OpenHarmony#深入浅出学习eTs#(六)编写eTs第一个控件

本项目Gitee仓地址&#xff1a;深入浅出eTs学习: 带大家深入浅出学习eTs (gitee.com) 一、控件基本属性 在使用第一个控件前&#xff0c;我们需要了解一些控件都有哪些基础属性&#xff0c;比如说我们在Super Visual中使用过的长宽和字体大小等等&#xff0c;通用属性有以下这…

Retrofit的使用

文章目录Retrofit的使用最好用的网络库: RetrofitRetrofit的基本用法处理复杂接口的地址类型Retrofit构建器的最佳写法Retrofit的使用 最好用的网络库: Retrofit Retrofit是一款由Square公司开发的网络库,但是它和OkHttp定位完全不同,OkHttp的侧重点是底层通信的实现,而Retro…

Java集合类——LinkedList(单链表及双链表)

一&#xff0c;ArrayList的缺陷 1.空间浪费 在之前的博客中&#xff0c;我利用源码详细的讲解了ArrayList这个集合类&#xff08;尤其是扩容机制&#xff09;&#xff0c;可以知道ArrayList的底层主要是一个动态的可变数组&#xff0c;容量满的时候需要进行1.5倍扩容。但是我…

第二十讲:神州路由器静态路由的配置

实验拓扑图如下所示 设备 端口 IP 子网掩码 网关 Router-A G0/0 120.83.200.55 255.255.255.0 无 G0/3 192.168.0.1 255.255.255.0 无 Router-B G0/0 120.83.200.56 255.255.255.0 无 G0/3 192.168.1.1 255.255.255.0 无 PC1 192.168.0.2 255.255.255…

jQuery 的基本使用

1、jQuery 介绍 1.1、JavaScript 库 JavaScript库&#xff1a;即 library&#xff0c;是一个封装好的特定的集合&#xff08;方法和函数&#xff09;。从封装一大堆函数的角度理解库&#xff0c;就是在这个库中&#xff0c;封装了很多预先定义好的函数在里面&#xff0c;比如动…

【C++】const关键字

【C】const关键字 0x1 常量 C定义常量有两种方式 #define 宏常量&#xff1a;#define 常量名 常量值 通常在文件上方定义&#xff0c;表示一个常量宏常量不可以修改 // 宏常量 #define MAX 999int main() {return 0; }const修饰的变量&#xff1a; const 数据类型 常量名 …

docker 安装Es

1、下载镜像文件 docker pull elasticsearch:7.4.2 存储和检索数据 docker pull kibana:7.4.2 可视化检索数据 2、创建实例 1、ElasticSearch mkdir -p /mydata/elasticsearch/config mkdir -p /mydata/elasticsearch/data echo "http.host: 0.0.0.0" >…

第三十六章 数论——容斥原理

第三十六章 数论——容斥原理一、容斥原理1、定理内容二、代码模板1、问题&#xff08;1&#xff09;如何求出能够被整除的个数&#xff1f;&#xff08;2&#xff09;如何枚举出2n−12^n-12n−1种情况&#xff1f;2、代码实现&#xff1a;一、容斥原理 1、定理内容 我们在高…