如何用Jsoup解析eBay倒计时元素并在Android Studio中实现倒计时器
用Jsoup解析eBay倒计时并在Android中实现倒计时器
没问题,我来一步步帮你解决这个问题——从用Jsoup解析eBay的倒计时文本,到在Android Studio里实现倒计时器,全程给你捋清楚:
1. 解析eBay的倒计时元素
首先明确:你完全可以像解析普通HTML元素一样操作这个span标签,因为它就是标准的HTML元素,只是带有特定的id和class而已。
Jsoup解析的核心就是通过选择器定位元素,这里元素的id是vi-cdown_timeLeft,用id选择器就能精准定位。在你提供的getTimer方法基础上,补充解析逻辑:
public synchronized void getTimer() { new Thread(new Runnable() { @Override public void run() { try { sem.acquire(); // 连接eBay页面获取文档 Document doc = Jsoup.connect(linkurl).get(); // 通过id选择器定位倒计时元素,获取文本内容 String countdownText = doc.select("#vi-cdown_timeLeft").text().trim(); // 这里countdownText就是你要的"5g 20h "这类文本(注意"g"可能是eBay页面的笔误,应该是"d"代表天?不过不影响后续转换) // 后续处理逻辑... sem.release(); } catch (IOException | InterruptedException e) { e.printStackTrace(); // 记得释放信号量,避免死锁 sem.release(); } } }).start(); // 注意要调用start()启动线程,你原来的代码漏了这一步! }
这段代码和解析普通div、p元素的逻辑完全一致:通过选择器定位,调用text()获取元素内的文本,没有任何特殊处理。
2. 转换时间并实现Android倒计时器
接下来要把拿到的倒计时文本(比如"5g 20h ")转换成毫秒数,再用Android自带的CountDownTimer实现倒计时UI更新。结合你提到的getMsFromString方法,完善代码:
public synchronized void getTimer() { new Thread(new Runnable() { @Override public void run() { try { sem.acquire(); Document doc = Jsoup.connect(linkurl).get(); String countdownText = doc.select("#vi-cdown_timeLeft").text().trim(); // 用getMsFromString把文本转换成总毫秒数 long totalMillis = getMsFromString(countdownText); // 注意:Android中不能在子线程更新UI,必须切换到主线程 runOnUiThread(new Runnable() { @Override public void run() { // 创建并启动倒计时器 new CountDownTimer(totalMillis, 1000) { @Override public void onTick(long millisUntilFinished) { // 这里处理每秒的UI更新,比如把剩余毫秒转成天、小时、分钟 long days = millisUntilFinished / (1000 * 60 * 60 * 24); long hours = (millisUntilFinished % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60); long minutes = (millisUntilFinished % (1000 * 60 * 60)) / (1000 * 60); // 更新TextView显示倒计时 yourCountdownTextView.setText(String.format("%dd %dh %dm", days, hours, minutes)); } @Override public void onFinish() { // 倒计时结束后的操作 yourCountdownTextView.setText("拍卖已结束"); } }.start(); } }); sem.release(); } catch (IOException | InterruptedException e) { e.printStackTrace(); sem.release(); } } }).start(); }
关键注意点
- 网络权限:别忘了在
AndroidManifest.xml中添加网络权限,否则Jsoup无法发起请求:<uses-permission android:name="android.permission.INTERNET" /> - 线程安全:Jsoup的网络请求必须放在子线程,不能在主线程执行,否则会触发NetworkOnMainThreadException;更新UI必须通过
runOnUiThread或者Handler切换到主线程。 - 页面结构变化:eBay的页面结构可能会更新,如果后续
vi-cdown_timeLeft这个id被修改,你需要调整选择器。 - 信号量使用:确保
sem.release()在所有分支都被调用,避免死锁。
内容的提问来源于stack exchange,提问作者Daniele Asta
相关产品推荐
相关产品推荐

