簡體   English   中英

Android:請求后一定時間檢索網站的html

[英]Android: retrieve html of website certain time after request

我的目標是以可讀的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.sleep(5000)在請求發出后幾秒鍾獲取html (希望它有足夠的時間來更新html Thread.sleep(5000) ,但這不起作用。 有誰知道如何處理這個問題?

我從你的問題中理解的是,你需要在頁面完全加載后獲取網頁的HTML(在頁面內運行所有腳本之后)。

AFAIK,你無法通過當前的實現實現這一目標。 一旦調用函數HttpClient.execute()就不能在該函數中應用任何延遲,它只會獲取當前可用的數據。 你也不能使用Handler 它只會幫助你延遲'execute()'調用。

遺憾的是,我們無法設置任何偵聽器,只要網頁中的數據發生變化(至少我不知道任何此類功能),它將提供回調。

但是你可以使用一種完全不同但無痛的方法來實現這一點。 這是你如何實現它。

  1. 在您的活動中放置一個WebView ,將其隱藏起來
  2. 在WebView中加載網頁
  3. onPageFinished() WebViewClient實現的onPageFinished()並從那里將WebView的html內容注入到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長度:10438

同時從JavaScriptInterface的函數html()編寫的日志是

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

您可以看到我在兩種情況下獲得的HTML字符串大小的差異。 希望這可以幫助。

更新(8月7日):執行延遲取決於網頁完全加載到網頁瀏覽中所花費的時間。 這種方法適用於包含啟動腳本的網頁。 對於靜態網頁,最好使用HttpClient.execute()

你不想在AsyncTask上長時間睡眠,因為它會阻止任何其他AsyncTask。 我會設置一個5秒的計時器並啟動第二個AsyncTask實例來進行第二次讀取。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM