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

use*_*661 5 html javascript java html5 android

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

以下是我正在尝试做的一个示例:在网站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),但这不起作用.有谁知道如何处理这个问题?

gnu*_*anu 7

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

AFAIK,你无法通过当前的实现实现这一目标.调用该函数后,HttpClient.execute()您无法在该函数中应用任何延迟,它只会获取当前可用的数据.而你也不能使用Handler.它只会帮助你延迟'execute()'调用.

遗憾的是,我们无法设置任何侦听器,只要网页中的数据发生变化(至少我不知道任何此类功能),它将提供回调.

但是你可以使用一种完全不同但无痛的方法来实现这一点.这是你如何实现它.

  1. WebView在您的活动中放置一个,隐藏它
  2. 在WebView中加载网页
  3. 钩住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().