You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 07:07:43