[英]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()'調用。
遺憾的是,我們無法設置任何偵聽器,只要網頁中的數據發生變化(至少我不知道任何此類功能),它將提供回調。
但是你可以使用一種完全不同但無痛的方法來實現這一點。 這是你如何實現它。
WebView
,將其隱藏起來 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.