java - 使用 jsoup 收集倒数计时器并为 android 设置一个计时器

标签 java android jsoup

我想从 ebay 解析一个倒数计时器

<span id="vi-cdown_timeLeft" class="">5g 20h </span>

我如何用jsoup解析它以在android studio上创建一个倒数计时器?

我可以像普通的元素一样解析它吗?如下图

更新: getMsFromString 与下面从 shn android dev 编写的方法相同

public synchronized void getTimer() {
    new Thread(new Runnable() {
        @Override
        public void run() {
            try {
                sem.acquire();

                Document doc = Jsoup.connect(linkurl).get();
                remaining = doc.select("#vi-cdown_timeLeft").first().text();
                msFromString = getMsFromString(remaining);
                long remainingMs = System.currentTimeMillis() - msFromString;
                new CountDownTimer(remainingMs, 1000) {

                    public void onTick(long millisUntilFinished) {
                        timer.setText("seconds remaining: " + millisUntilFinished / 1000);
                    }

                    public void onFinish() {
                        timer.setText("done!");
                    }

                }.start();
                sem.release();
            } catch (InterruptedException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }



        }
    });

最佳答案

因此,与倒数计时器相关的 ebay 网页的 HTML 部分如下所示:

<span class="vi-tm-left">
     <span class="timeMs" timems="1522415936000">Friday, 8:18AM</span>
</span>

您想获取具有“timems”属性span 元素 的值。请注意,timems 是自 1970 年 1 月 1 日以来经过的毫秒数。

在您的 JSoup 中尝试执行以下代码以获取 timems 的值(您需要将 URL 更改为您的 eBay 出价所在的位置!):

Document doc = Jsoup.connect("http://myebayurl.com/").get();
Element timeSpanEle = doc.select("span.timeMs").first();
long timeMs = Long.parseLong(timeSpanEle.attr("timems"));

现在我们有了 Unix 时间戳的值(以毫秒为单位,而不是秒!)指示拍卖何时到期。现在我们需要在 Android Studio 上制作一个倒数计时器。我们可以使用 android.os.CountDownTimer 来执行此操作,因为您尚未指定要使用的类(但是这应该让您了解如何执行此操作)。

long remainingMs = System.currentTimeMillis() - timeMs;
new CountDownTimer(remainingMs, 1000) {

     public void onTick(long millisUntilFinished) {
         mTextField.setText("seconds remaining: " + millisUntilFinished / 1000);
     }

     public void onFinish() {
         mTextField.setText("done!");
     }

}.start();

编辑:原来帖子中的内容发生了一点变化。根据您的说法,带有拍卖剩余时间的 HTML 不是 UNIX 时间戳,而是一个字符串值,因此前面的答案对您不起作用。这是因为意大利版的 Ebay 网站(OP 正在使用的那个)不同于美国版(我错误地认为 OP 正在使用的那个版本)。这是更新后的答案。

鉴于您要处理的时间采用以下格式而不是 UNIX 时间戳:

Xg Yh Zm

其中 X 是天数 (g),Y 是小时数 (h),Z 是分钟数 (m)。

我们通过以下方式获取剩余时间的值:

Document doc = Jsoup.connect("http://myebayurl.com/").get();
String remaining = doc.select("#vi-cdown_timeLeft").first().text();

我们现在需要解析这个字符串并将其转换为 ms 剩余。从上面取出时间剩余的String,用下面的静态方法解析成ms:

public static long getMsFromString(String str) {
    String[] arr = str.split(" ");
    long auctionTimeLeft = 0;
    for(String s : arr){
        if(s.contains("g")) { //convert days to milliseconds
            auctionTimeLeft += Long.parseLong(s.substring(0, s.indexOf("g"))) * 8.64e7;
        }
        else if(s.contains("h")){ //convert hours to milliseconds
            auctionTimeLeft += Long.parseLong(s.substring(0, s.indexOf("h"))) * 3.6e6;
        }
        else if(s.contains("m")){ //convert minutes to milliseconds
            auctionTimeLeft += Long.parseLong(s.substring(0, s.indexOf("m"))) * 60000;
        }
    }
    return auctionTimeLeft;
}

结论

  1. 从 ebay 获取剩余拍卖时间字符串(即“3g 10h 5m”)
  2. 对第一步中的字符串调用getMsFromString
  3. 在倒数计时器中使用步骤 2 中剩余的毫秒数(上例中的 remainingMs)

关于java - 使用 jsoup 收集倒数计时器并为 android 设置一个计时器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49565617/

相关文章:

java - 将文件从目录复制到另一个,具有文件和目录的路径

java - 在java中与支持ssl的服务器通信

java - 如何将html字符串传递给另一个 Activity webView

android 在对话框中加载 webview

java - 在内部类中访问变量。将对话框添加到 ListView 时需要声明为final

java - 创建图形复杂的 Java Swing 应用程序的最佳编程过程?

android - listview 没有从我的 for 循环中填充,我做错了什么?

java - Jsoup 匹配任何具有命名空间的元素

java - 如何获取网站中的所有超链接及其段落?

Android - 将 Jsoup 与 android_asset html 文件一起使用