gpt4 book ai didi

java - Android:请求后一定时间检索网站的html

转载 作者:太空狗 更新时间:2023-10-29 15:41:03 24 4
gpt4 key购买 nike

我的目标是在可读的 String 中检索网站的 html(我已经完成了),并稍微修改代码以便 Get 命令发出后的某个时间检索 html

这是我尝试做的一个例子:在网站 http://time.gov/HTML5/ 上,页面加载时出现的 html 不是完整的 html;几秒钟后,javascript 命令执行,稍微修改了 html。我的目标是获得修改后的 html

这是我为获取网站 html 所做的:

public class MainActivity extends Activity {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

DownloadTask task = new DownloadTask();
task.execute("http://time.gov/HTML5/");

}

private class DownloadTask extends AsyncTask<String, Void, String>{

@Override
protected String doInBackground(String... urls) {
HttpResponse response = null;
HttpGet httpGet = null;
HttpClient mHttpClient = null;
String s = "";

try {
if(mHttpClient == null){
mHttpClient = new DefaultHttpClient();
}


httpGet = new HttpGet(urls[0]);


response = mHttpClient.execute(httpGet);
s = EntityUtils.toString(response.getEntity(), "UTF-8");


} catch (IOException e) {
e.printStackTrace();
}
return s;
}

@Override
protected void onPostExecute(String result){
final TextView textview1 = (TextView) findViewById(R.id.headline);
textview1.setText(result);

}
}
}

此代码正确获取未修改的 html。但是,我试图通过使用 Thread 在发出请求后几秒钟获取 html(希望它有足够的时间更新 html) .sleep(5000),但这不起作用。有谁知道如何解决这个问题?

最佳答案

我从你的问题中了解到,你需要在页面完全加载后(在页面内运行所有脚本之后)获取网页的 HTML。

据我所知,您当前的实现无法实现此目的。一旦您调用函数 HttpClient.execute(),您就不能在该函数内应用任何延迟,它只会获取当前可用的数据。而且您也不能使用 Handler。它只会帮助您延迟“execute()”调用。

不幸的是,我们无法为客户端设置任何监听器,只要网页中的数据发生变化,客户端就会提供回调(至少我不知道有任何此类功能)。

但是您可以使用完全不同但无痛的方法来实现这一点。这就是您实现它的方式。

  1. 在你的 Activity 中放置一个WebView,保持隐藏
  2. 在 WebView 中加载网页
  3. Hook WebViewClient 实现的 onPageFinished(),然后从那里将 WebView 的 html 内容注入(inject)到您的 JavaScriptInterface 实现中。

WebView :

在您的布局 XML 中

<WebView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/my_web"
android:visibility="gone"/>

在你的 Activity onCreate() 中

TextView textview1;

public void onCreate(Bundle savedInstanceState) {

/* Your code here */

textview1 = (TextView) findViewById(R.id.TextView1);

WebView web = (WebView) view.findViewById(R.id.my_web);
web.getSettings().setJavaScriptEnabled(true);
web.addJavascriptInterface(new CustomJavaScriptInterface(), "JavaScriptInterface");
web.setWebViewClient(new CustomWebViewClient());
web.loadUrl("http://time.gov/HTML5/");

/* Your code here */
}

WebViewClient

private class CustomWebViewClient extends WebViewClient {
@Override
public void onPageFinished(WebView view, String url) {
//Inject the HTML in to the JavaScriptInterface
view.loadUrl("javascript:window.JavaScriptInterface.html('<html>'+document.getElementsByTagName('html')[0].innerHTML+'</html>');");
}
}

JavaScritpInterface

private class CustomJavaScriptInterface {

@JavascriptInterface
public void html(final String html) {
//Your HTML is here
runOnUiThread(new Runnable() {
@Override
public void run() {
setTextHtml(html);
}
});
Log.e("HTML Length", Integer.toString(html.length()));
}
}

private void setTextHtml(String html) {
textview1.setText(html);
}

结论:

为了验证这一点,我将行 Log.e("HTML Length", Integer.toString(html.length())); 放入 AsyncTask 的 postExecute() 这就是我记录的内容。

08-05 14:29:59.886 13332-13332/com.sample.fetchhtml E/HTML Length﹕ 10438

同时JavaScriptInterface的函数html()写入的日志是

08-05 14:30:09.021 13332-13420/com.sample.fetchhtml E/HTML Length﹕ 22498

您可以看到我在这两种情况下得到的 HTML 字符串的大小差异。希望这会有所帮助。

更新(8 月 7 日):执行延迟取决于网页在 webview 中完全加载所花费的时间。这种方式适用于包含启动脚本的网页。对于静态网页,最好使用 HttpClient.execute()

关于java - Android:请求后一定时间检索网站的html,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25098705/

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