use*_*661 5 html javascript java html5 android
我的目标是检索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);
}
}
}
Run Code Online (Sandbox Code Playgroud)
此代码正确获取未修改html.但是,我试图html在请求发出后几秒钟(希望它有足够的时间来更新html)Thread.sleep(5000),但这不起作用.有谁知道如何处理这个问题?
我从你的问题中理解的是,你需要在页面完全加载后获取网页的HTML(在页面内运行所有脚本之后).
AFAIK,你无法通过当前的实现实现这一目标.调用该函数后,HttpClient.execute()您无法在该函数中应用任何延迟,它只会获取当前可用的数据.而你也不能使用Handler.它只会帮助你延迟'execute()'调用.
遗憾的是,我们无法设置任何侦听器,只要网页中的数据发生变化(至少我不知道任何此类功能),它将提供回调.
但是你可以使用一种完全不同但无痛的方法来实现这一点.这是你如何实现它.
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"/>
Run Code Online (Sandbox Code Playgroud)
在你的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 */
}
Run Code Online (Sandbox Code Playgroud)
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>');");
}
}
Run Code Online (Sandbox Code Playgroud)
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);
}
Run Code Online (Sandbox Code Playgroud)
结论:
为了验证这一点,我将该行Log.e("HTML Length", Integer.toString(html.length()));放在AsyncTask中postExecute(),这就是我记录的内容.
08-05 14:29:59.886 13332-13332/com.sample.fetchhtml E/HTML长度:10438
同时从函数html()中写入的日志JavaScriptInterface是
08-05 14:30:09.021 13332-13420/com.sample.fetchhtml E/HTML长度:22498
您可以看到我在两种情况下获得的HTML字符串大小的差异.希望这可以帮助.
更新(8月7日):执行延迟取决于网页完全加载到网页浏览中所花费的时间.这种方法适用于包含启动脚本的网页.对于静态网页,最好使用HttpClient.execute().
| 归档时间: |
|
| 查看次数: |
390 次 |
| 最近记录: |