gpt4 book ai didi

java - 使用 JSOUP 将文档加载到 WebView

转载 作者:搜寻专家 更新时间:2023-11-01 08:41:34 25 4
gpt4 key购买 nike

我正在尝试将网页的一部分解析为 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();
}

}

但是我总是报错

Attempt to invoke virtual method 'java.lang.String org.jsoup.select.Elements.html()' on a null object reference

最佳答案

您的问题是您正在使用一个线程来下载和解析 HTML 内容(这是正确的做法),然后您试图从线程的元素对象加载。因为下载页面需要一些时间才能完成,所以您在 element.html() 初始化之前调用它,因此为 null - 这就是您收到 NullPointerException 的原因。

为了解释发生了什么,让我们看一下 loadArticleWithHtml 方法的流程:

  1. 你创建了一个线程来下载和解析 HTML
  2. 您启动线程,可能会开始下载页面
  3. 您设置 WebViewClient
  4. 您将数据加载到 WebView 并尝试访问 element.html()(元素尚未初始化且仍为空)并获得空指针异常
  5. 一段时间后,页面下载完成,元素被初始化

我建议你阅读 more about threading .当您使用线程时,该进程与 UI 线程(这是您加载 HTML 的地方)并行运行,并且不能保证在 UI 线程中的其余代码完成之前完成。事实上,在 UI 线程上工作并在其中启动一个线程,如果代码执行任何缓慢的操作(如下载),几乎可以保证线程将在 UI 代码完成后完成。

因此,解决方案是正确地线程化您的应用程序并加载 WebView AFTER 元素变量已从线程内初始化。见下文。

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 方法,因为它是一个 View ,应该从主线程访问。参见 this Q/A有关在 UI 线程上运行代码的更多信息。

关于java - 使用 JSOUP 将文档加载到 WebView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32074071/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com