使用 JSOUP 将文档加载到 WebView

2023-12-09

我正在尝试将网页的一部分解析为 WebView。我正在使用 jsoup 库获取我需要的部分页面,然后加载到 webview。 这是代码:

public void loadArticleWithHTML (){
    Thread downloadThread = new Thread() {
        public void run() {
            try {
                doc = Jsoup.connect("http://en.wikipedia.org/").get();
                element = doc.select("#mp-itn b a");

            } catch (java.io.IOException e){
                e.printStackTrace();
            }
        }
    };
    downloadThread.start();

    mWebView.setWebViewClient(new WebViewClient() {
        public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
            Toast.makeText(getApplicationContext(), description, Toast.LENGTH_SHORT).show();
        }
    });
    try {
        mWebView.loadData(element.html(), "text/html", "UTF-8");
    } catch (NullPointerException e){
        e.printStackTrace();
        Toast.makeText(getApplicationContext(), "error", Toast.LENGTH_LONG).show();
    }

}

但我总是收到错误

尝试在空对象引用上调用虚拟方法“java.lang.String org.jsoup.select.Elements.html()”


您的问题是您正在使用线程下载并解析 HTML 内容(这是正确的做法),然后您尝试从 Element 对象加载outside线程。由于下载页面需要一些时间才能完成,因此您正在调用element.html()在它被初始化之前,因此为空 - 这就是为什么你会得到一个 NullPointerException。

为了解释发生了什么,让我们看看你的流程loadArticleWithHtml method:

  1. 您创建一个应该下载并解析 HTML 的线程
  2. 您启动线程,页面的下载可能会开始
  3. 您设置 WebViewClient
  4. 您将数据加载到 WebView 中并尝试访问element.html()(元素还没有初始化,仍然为空)并得到空指针异常
  5. 一段时间后,页面下载完成并element已初始化

我建议你阅读有关线程的更多信息。当您使用线程时,该进程与 UI 线程(您正在加载 HTML 的位置)并行运行,并且不能保证在 UI 线程中的其余代码完成之前完成。事实上,在 UI 线程上工作并在其中启动一个线程,如果代码正在执行诸如下载之类的缓慢操作,则几乎可以保证该线程将在 UI 代码完成后完成。

因此,解决方案是正确地对应用程序进行线程化并加载 WebViewAFTER元素变量已在线程内初始化。见下文。

public void loadArticleWithHTML (){
    Thread downloadThread = new Thread() {
        public void run() {
            try {
                doc = Jsoup.connect("http://en.wikipedia.org/").get();
                element = doc.select("#mp-itn b a");

            } catch (java.io.IOException e){
                e.printStackTrace();
            }
            if (element == null) {
                Log.e("error", "There is a problem with the selection");
            } else {
                // post a new Runnable from a Handler in order to run the WebView loading code from the UI thread
                new Handler(Looper.getMainLooper()).post(new Runnable() {
                    @Override
                    public void run() {
                        mWebView.loadData(element.html(), "text/html", "UTF-8");
                    }
                });
            }
        }
    };

    mWebView.setWebViewClient(new WebViewClient() {
        public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
            Toast.makeText(getApplicationContext(), description, Toast.LENGTH_SHORT).show();
        }
    });

    downloadThread.start();
}

请注意,您需要从 UI 线程运行 WebView 方法,因为它是一个视图,应该从主线程访问。看this Q/A有关在 UI 线程上运行代码的更多信息。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 JSOUP 将文档加载到 WebView 的相关文章

  • Kotlin Room 数据库单例模式

    我正在尝试创建单人房间数据库 我找到了两种解决方案 但我不知道它们之间有什么区别 根据这个文件 companion object Volatile private var INSTANCE AppDatabase null fun getI
  • Android NDK C++“wstring”支持

    我有用 C 编写的源代码 lib 现在我想在 Android NDK 项目 NDK 6 中编译并使用相同的源代码 lib 我能够编译大多数 C 文件 除了基于 std wstring 的功能 在 Application mk 中 当我指定时
  • Java元数据读写

    是否可以以通用方式 对于所有图像类型 在 Java 中读取和写入元数据 我找到了一些示例 但它们总是特定的 例如 JPEG 或 PNG 我需要一些足够通用的东西 而不是到处都有 if else 语句 我不想重写源代码 但这是一个很好的例子
  • Java:使用 Java.util.concurrent 线程访问读取线程串行端口

    我正在尝试编写一个 Java 串行设备驱动程序并想使用 对我来说是新的 java util concurrent包裹 我有一种发送数据包然后等待 ACK 的方法 我打算有炭 接收在不同的线程中运行 如果接收线程收到 ACK 它应该使用发送数
  • 如何通过子 POJO 的属性过滤复合 ManyToMany POJO?

    我有两个像这样的房间实体 Entity public class Teacher implements Serializable PrimaryKey autoGenerate true public int id ColumnInfo n
  • 抽象类或接口。哪种方式是正确的?

    有两种方法可以选择抽象类或接口 微软解决方案和Oracle解决方案 微软 设计指南 请使用抽象 在 Visual Basic 中为 MustInherit 类而不是接口来将协定与实现分离 http msdn microsoft com en
  • 使用Java开发跨平台,不同平台字体缩放不同

    我正在为我的大学制作一些软件 需要一个 GUI 在它的第一个版本中 我让它使用系统外观 因此它看起来像 Linux Mac Windows 中的本机应用程序 我发现这很麻烦 因为我必须根据操作系统使所有 JLabel 具有不同的大小 无论分
  • 在哪里可以获得用于导入 libcore.io 的 JAR?

    我想处理一个GaiException在我的应用程序中 调试器告诉我 它位于 libcore io 包中 但导入它会产生错误 我想我需要向我的项目添加一个额外的 JAR 才能正确解析此类型 我在我的 android sdk 文件夹中进行了一些
  • Webview 电子邮件链接 (mailto)

    我有一个视图并查看该网站有用于发送电子邮件的 malito 代码 当我打开链接时 会出现错误 我希望当我打开链接时打开 Gmail 应用程序或其他电子邮件应用程序 感谢所有帮助者 public class teacher extends A
  • 如何在kotlin中使用Coroutine每秒调用一个函数

    我刚刚创建了一个应用程序 其中我的函数 getdata 每秒调用一次以从服务器获取新数据 而 updateui 函数将更新 UI 中的视图 我在我的应用程序中不使用任何异步任务或协程 我想这样做 请告诉我我怎样才能做到这一点 这是我的代码
  • 如何在NavigationView的菜单项中设置椭圆形?

    我想在 NavigationView 的菜单项中设置 android ellipsize end 在我当前的实现中 当菜单项中的文本太长时 它只是在末尾被剪切 这是我到目前为止所尝试过的
  • 使用 qbs 构建 qt 应用程序

    我想知道在 Linux 上使用 qbs 编译 构建和创建 Android Qt 应用程序的步骤 我拥有所有必要的工具 目前我可以使用 qmake 创建 apk Qbs 目前不支持构建 Qt Android 应用程序 Qbs v1 4 中引入
  • 从命令行运行 Maven 插件的语法是什么。

    我看到这里已经有人问过这个问题 如何从命令行执行maven插件 https stackoverflow com questions 12930656 how to execute maven plugin from command line
  • 如何将QR码中的3个方块替换为圆圈以使用Paint android使用zxing自定义QR码?

    我用它作为自定义的参考 从方形到圆形使用zxing生成的QR码它是在java中所以我尝试将它转换为在android中使用 使用 zxing 生成具有自定义点形状的 QR 码 https stackoverflow com questions
  • JMockit - 初始化问题

    当我使用以下测试时 我收到警告 警告 JMockit 是按需初始化的 这可能会导致某些测试失败 请检查文档以获取更好的初始化方法 这是我的测试实现 package test import static mockit Mockit impor
  • 编写自定义 Eclipse 调试器

    EDIT 一定有某种方法可以解决这个问题 而无需编写全新的调试器 我目前正在研究在现有 java 调试器之上构建的方法 如果有人对如何获取 Java 调试器已有的信息 有关堆栈帧 变量 原始数据等 有任何想法 那将非常有帮助 我想要做的是我
  • java.io.EOFException:没有更多可用数据 - 预期结束标记 关闭开始标记

    我正在使用 xmpp 开发一个聊天应用程序 根据我们的要求 我们有三台服务器 Apache Tomcat 7 ejabbered 2 1 11 和 mysql 5 5 to run xmppbot on tomcat used below
  • Fragment 的 onSaveInstanceState() 永远不会被调用

    我试图将数据保存在片段的 onSaveInstanceState 中 但该方法从未被调用 有人可以帮忙吗 public class MyFragment extends Fragment Override public View onCre
  • Integer.parseInt 引发的 NumberFormatException

    嘿 我在学校上编码课 但老师没有很好地解释 所以我们必须在网上查找我所做的信息 但我无法找到代码中的错误 你能帮我吗 char end s do System out println Tipo de boleto char boleto c
  • Libgdx 和 Google 应用内购买结果

    我遵循了这些指示 https github com libgdx libgdx wiki Interfacing with platform specific code使用 ActionResolver 接口集成 Libgdx 和原生 An

随机推荐

  • 获取列中允许的最大长度,mysql

    我需要知道如何获取 mysql 中特定列的最大大小 该表是 turno CREATE TABLE turno idTurno tinyint 4 NOT NULL nombreTurno varchar 20 COLLATE utf8 sp
  • 获取未设置为对象实例的对象引用的空引用对象的类型

    自从我开始编程以来 这个问题一直困扰着我 不是 我的代码在哪里为空 而是有什么方法可以从异常中获取为空的对象的类型吗 如果做不到这一点 任何人都可以提供博客文章或 msdn 文章来解释 NET Framework 不 或不能 提供这些详细信
  • 数据库错误:“没有为一个或多个必需参数给出值。”

    我有一个数据网格 我应该将其列值插入到访问数据库中 但我有问题command ExecuteNonQuery 我的项目因为这个错误而没有完成 这是我的代码 for int i 0 i lt dataGridFactorRent Rows C
  • .NET Flag Enum 从值获取属性

    问候 StackOverflow 如果我有一个具有 Flag 属性的枚举类型以及该枚举类型中具有其自己的属性的值 我如何检索所有适当的属性 例如 Flags enum MyEnum EnumDisplayName Enum Value 1
  • 如何使用触发器输出作为复位信号的输入

    我在柜台里放了 3D 触发器 一旦达到 5 101 我想将 FF 复位输入设置为高 使用或门 复位为低电平有效 这几乎可以工作 但是 当我最初运行程序时 触发器的 Q 输出都是未知的 因此 最初 或门的复位输入为低电平 但是 因为一开始 Q
  • 通过 JSON-RPC 将 CREATERAWTRANSACTION 发布到 Bitcoin Core 时遇到问题

    我正在尝试通过以下方式发布到本地比特币完整节点json rpc但我从服务器收到错误 按照此处的文档进行操作 https bitcoincore org en doc 0 17 0 rpc rawtransactions createrawt
  • jQuery 复选框验证

    我使用下面的 jQuery 代码来验证表单 现在一切都很好 但我希望复选框验证使用 validator而不是其当前的alert 但是当我添加required required 对于复选框输入框 我会收到所有复选框的消息 而我只需要一个 re
  • 如何在保留所有箭头的同时消除 TreeView 中的线条

    我有一个 TreeView 我正在使用它来剥皮SetWindowsTheme pinvoke 但是我无法删除出现的树线 我不想画 主人 因为我相信这相当于用一辆 18 轮卡车来运送一份炸玉米饼 杀伤力太大 有什么干净 快速的方法可以消除树叉
  • java中的视频转换[关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 目前不接受答案 Java 是否有任何框架或开源项目可以将视频从任何视频格式转换为任何视频格式 类似的东西Panda视频转换框架 你指的是JMF吗 Java媒体框架
  • 如何在弹出框内显示键盘?,ipad 密码锁定样式

    是否可以按照为 ipad 设置密码时显示的方式显示键盘 不幸的是没有 但我所做的复制是 使用界面生成器在我的密码视图中构建了一堆按钮 例如键盘 然后将每个按钮链接到一个可以更改文本字段的命令 IBAction button9 clicked
  • 如何在画布上填充图案并沿着形状弯曲?

    I have one image like this and I want to fill with pattern like this to make result like this I can fill the pattern usi
  • 如何解决 rstudio 中的“plot.new() 错误:图形边距太大”?

    我已阅读与此问题相关的所有帖子 但事实是 如果您有很多变量要绘制 则此问题仍然会发生 我的笔记本电脑分辨率是 1080p 我打开 rstudio 并运行以下脚本 a lt iris 1 4 gt a lt t a gt a lt as da
  • 正则表达式忽略重复匹配

    我有这样的字符串 var str When Home is on fire go and dance in fire 我想检查我的字符串是否有单词home and fire 为此 我使用了这个正则表达式 var words str matc
  • 托管到 iis 时无法访问打印机

    我在 MVC 中使用 rdlc 报告 在 Visual Studio 中运行时打印操作工作正常 但是当发布到同一台机器中设置的 iis 时 打印操作没有发生 但是当我将报告作为 pdf 返回时 报告会显示在那里 我可以使用 javascri
  • EaselJS onclick 接管整个画布

    我正在使用 canvas 和 EaselJS 构建游戏 但是在 onclick 内执行任何删除窗口焦点的操作时会出现问题 即 提示 警报 窗口打开 据我所知 它发生在 FireFox 和一些移动 Android 设备上 我想我明白为什么会这
  • Git rebase:没有跟踪信息

    我在用git version 2 9 0 windows 1我想重新设置本地存储库 非远程 但我总是得到 当前分支没有跟踪信息 请指定您要针对哪个分支进行变基 有关详细信息 请参阅 git rebase 1 git 变基 如果您想为此分支设
  • 无法使用图像和名称正确填充 ListPicker 控件

    我已经为用户创建了一个 ListPicker 控件来更改他或她的背景 但并非所有信息都正确填充在 ListPicker 控件中 当用户导航到我的 SettingsPage 时 会出现问题 所有 ListPicker 项目的文本都正确显示 但
  • Android - 使用 LocationManager 不会提供地理修复

    我正在尝试使用以下代码获取 G1 的 GPS 位置 活动中 MyLocationListener myListener new MyLocationListener LocationManager myManager LocationMan
  • 更改 app.config 后强制重新生成 Settings.settings 文件

    我有一个自动构建过程 可以将应用程序设置为指定模式 例如 Dev uat live 根据这种模式 我想将连接字符串更新为相关的连接字符串 但是 在我的数据访问层中有一个 app config 文件 它存储连接字符串 用于提供 Setting
  • 使用 JSOUP 将文档加载到 WebView

    我正在尝试将网页的一部分解析为 WebView 我正在使用 jsoup 库获取我需要的部分页面 然后加载到 webview 这是代码 public void loadArticleWithHTML Thread downloadThread