我的目标是以可读html
(我已经完成)检索网站的String
,并稍微修改代码,以便检索html
某个网站Get
命令后的时间。
以下是我正在尝试执行的操作的示例:在网站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
。但是,我试图在发出请求后的几秒钟内获取html
(希望有足够的时间来使用html
来更新Thread.sleep(5000)
),但这不是工作。有谁知道如何处理这个问题?
答案 0 :(得分:7)
我从您的问题中了解到,您需要在页面完全加载后获取网页的HTML(在页面内运行所有脚本之后)。
AFAIK,您无法通过当前的实施来实现这一目标。调用函数HttpClient.execute()
后,您无法在该函数中应用任何延迟,它只会获取当前可用的数据。你也不能使用Handler
。它只会帮助您延迟执行()&#39;调用
不幸的是,我们无法为客户端设置任何监听器,只要网页中的数据发生变化(至少我不知道任何此类功能),它就会提供回调。
但是你可以使用一种完全不同但无痛的方法来达到这个目的。这就是你如何实现它。
WebView
,将其隐藏onPageFinished()
实施的WebViewClient
,并从那里将WebView的html内容注入您的JavaScriptInterface
实施。WebView:
在布局XML
中<WebView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/my_web"
android:visibility="gone"/>
在你的活动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
同时从html()
的函数JavaScriptInterface
写入的日志是
08-05 14:30:09.021 13332-13420 / com.sample.fetchhtml E / HTML Length: 22498
您可以看到我在两种情况下获得的HTML字符串大小的差异。希望这会有所帮助。
更新(8月7日):执行延迟取决于网页在网页浏览中完全加载所需的时间。这种方法适用于包含启动脚本的网页。对于静态网页,最好使用HttpClient.execute()
。
答案 1 :(得分:1)
你不想在AsyncTask上长时间休眠,因为它会阻止任何其他AsyncTask。我会设置一个5秒的计时器并启动第二个AsyncTask实例来进行第二次读取。