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

时间:2014-08-02 19:38:23

标签: java javascript android html html5

我的目标是以可读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)),但这不是工作。有谁知道如何处理这个问题?

2 个答案:

答案 0 :(得分:7)

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

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

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

但是你可以使用一种完全不同但无痛的方法来达到这个目的。这就是你如何实现它。

  1. 在您的活动中放置WebView,将其隐藏
  2. 在WebView中加载网页
  3. 挂钩onPageFinished()实施的WebViewClient,并从那里将WebView的html内容注入您的JavaScriptInterface实施。
  4. 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实例来进行第二次读取。