当前位置: 首页 > news >正文

Android WebView - loadUrl 方法的长度限制

loadUrl 方法的长度限制

  1. 在 Android WebView 开发中,使用 loadUrl 方法执行 Iavascript 代码并传递数据时,数据长度是受到限制的

  2. 数据长度通常被限制为不能超过 2MB


loadUrl 方法的长度限制演示

1、准备阶段
(1)Web
  • loadUrl.html
<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8" /><meta name="viewport" content="width=device-width, initial-scale=1.0" /><title>loadUrl</title></head><body><script>function printContentLength(content) {console.log("----- ", content.length);}</script></body>
</html>
(2)Activity Layout
  • activity_load_url.xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".LoadUrlActivity"tools:ignore="MissingConstraints"><WebViewandroid:id="@+id/wv_container"android:layout_width="match_parent"android:layout_height="500dp"app:layout_constraintEnd_toEndOf="parent"app:layout_constraintStart_toStartOf="parent"app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
(3)Activity Code
  • LoadUrlActivity.java
public class LoadUrlActivity extends AppCompatActivity {public static final String TAG = LoadUrlActivity.class.getSimpleName();@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_load_url);WebView wvContainer = findViewById(R.id.wv_container);wvContainer.loadUrl("file:///android_asset/webview/loadUrl.html");WebSettings webSettings = wvContainer.getSettings();webSettings.setJavaScriptEnabled(true);wvContainer.setWebViewClient(new WebViewClient() {@Overridepublic void onPageFinished(WebView view, String url) {super.onPageFinished(view, url);wvContainer.loadUrl("javascript:printContentLength('hello world')");}});}
}
2、测试记录
  1. 传递长度为 1MB 的数据
String str = new String(new char[1024 * 1024]).replace("\0", "a");wvContainer.loadUrl("javascript:printContentLength('" + str + "')");
# 输出结果-----  1048576
  1. 传递长度为 2MB 的数据
String str = new String(new char[2 * 1024 * 1024]).replace("\0", "a");wvContainer.loadUrl("javascript:printContentLength('" + str + "')");
# 输出结果(无)

优化方案

1、基本介绍
  1. 优先使用 evaluateJavascript 方法来执行 JavaScript 代码,它没有字符数限制,执行效率更高,并能获取 JavaScript 的返回值

  2. 如果仍然使用 loadUrl 方法来执行较长的 JavaScript 代码,可以分片传输数据

2、演示
(1)使用 evaluateJavascript 方法
  1. 传递长度为 1MB 的数据
String str = new String(new char[1024 * 1024]).replace("\0", "a");wvContainer.evaluateJavascript("printContentLength('" + str + "')", null);
# 输出结果-----  1048576
  1. 传递长度为 2MB 的数据
String str = new String(new char[2 * 1024 * 1024]).replace("\0", "a");wvContainer.evaluateJavascript("printContentLength('" + str + "')", null);
# 输出结果-----  2097152
(2)分片传输数据
  • 传递长度为 2MB 的数据
let contents = null;function printContentLength(content, chunkNum, chunkTotal) {if (contents == null) contents = [];contents.push(content);if (chunkNum != chunkTotal) return;console.log("----- ", contents.join("").length);
}
String str = new String(new char[2 * 1024 * 1024]).replace("\0", "a");// 分片传输字符串
int chunkSize = 1024 * 1024; // 1MB 分片
int chunkTotal = (int) Math.ceil((double) str.length() / chunkSize);
for (int i = 0; i < chunkTotal; i++) {int start = i * chunkSize;int end = Math.min(start + chunkSize, str.length());String chunk = str.substring(start, end);wvContainer.loadUrl(String.format("javascript:printContentLength('%s', %d, %d)",chunk, i + 1, chunkTotal));
}
# 输出结果-----  2097152
http://www.dtcms.com/a/574007.html

相关文章:

  • 温州网站推广公司wordpress万能
  • 开题报告之基于SpringBoot框架的在线答题网站的设计与实现
  • 珠海建站专业做辅助的网站
  • 南山做网站海外购物app排行榜前十名
  • 从一题了解 CROSS JOIN 与 DATEDIFF:SQL 天气温度对比实战
  • js:requestAnimationFrame的使用
  • 【JUnit实战3_29】第十八章:REST API 接口测试(上)——RESTful 风格的后端 API 的搭建
  • 回调函数的作用与举例(Python版)
  • 克旗网站制作5229998建设银行网站会员
  • 洛阳市政建设网站网站建设中 html免费
  • 自己创建网站怎么赚钱青海省住房建设厅网站首页
  • MiniEngine学习笔记 : DescriptorHeap
  • 智能合约与智能合约开发交互详解
  • 我想出租做房 请问哪个网站好些泰安最新通告今天
  • 下一代CDN安全体系:融合加速、抗攻击与业务智能
  • 光纤传输器与网络延长器2合1技术解析:
  • OpenHarmony开发实践-鸿蒙napi开发实践
  • Redis识别缓存与数据库数据的不一致性以及识别热Key教程
  • 网站运营培训机构网站建设是做什么的
  • 商丘网站建设专业现状网站首页布局
  • 28.DHCP
  • Linux基础指令-Linux学习笔记(1)
  • 可以推广网站市网站制作
  • STM32TIM定时器PWM1模式与PWM2模式配置
  • 阿勒泰建设局网站北京模板网站建设费用
  • 上传OSS直传
  • 网站正在建设中页面 英文翻译网络网站建设电话
  • 外企渣打内推
  • TGRS 即插即用 | 超越传统U-Net!ASCNet融合小波变换与全局注意力,重新定义图像修复范式
  • 一线城市网站建设费用高wordpress调用id数据