【问题标题】:Is there a work-around for ProgressBar.setProgress accepting an integer?ProgressBar.setProgress 接受整数是否有解决方法?
【发布时间】:2014-07-03 08:20:48
【问题描述】:

所以,我的应用程序因为“java.lang.NumberFormatException: Invalid int: “2160000000”而崩溃,据我了解,最大可能的整数是 2,147,483,647。所以,很明显它正在崩溃,因为我正在尝试 setProgress on具有太大 int 的 ProgressBar。

我的问题是:有办法解决这个问题吗? int 这么大,因为我将 DAYS、HOURS 和 MINUTES 转换为毫秒。 因此,当我输入任何大于 24 天、20 小时、31 分钟的值时,应用程序会崩溃。 (上面的任何东西都会创建一个太大而无法被 setProgress 接受的整数。)

但是,我需要最多可以输入 32 天,但我找不到任何方法可以绕过这个限制性参数到 CountDownTimer。我在下面发布了一些代码以及一些 LogCat 错误以获取补充信息。

非常感谢,伙计们!


根据时间戳计算计时器应位于何处的方法:

public int bsCalculation()                     LINE # 138
    DateTime date = new DateTime();
    long currentTime = date.getMillis();

    long bsDiffInMillis;
    if(bsTimeStamp==0) {
        bsDiffInMillis = 0;
    }
    else {
        bsDiffInMillis = currentTime - bsTimeStamp;
        timeInputBs -= bsDiffInMillis;
    }


    int bsDiffInt = Integer.parseInt(String.valueOf(bsDiffInMillis));
    int roundedDiffBs = (bsDiffInt + 500) / 1000 * 1000;


    j += roundedDiffBs;

return j;
}

将输入从 EditText(s) 转换为 millis 的方法:

public static Long getMillisForCrafting(long daysPh, long hoursPh, long minutesPh) {
                Locale.getDefault();
                DateTime bs = new DateTime();
                daysPulled = daysPh;
                hoursPulled = hoursPh;
                minutesPulled = minutesPh;

                final long nowInMillis = bs.getMillis();


                Long days = daysPulled * 86400000;
                Long hours = hoursPulled * 3600000;
                Long minutes = minutesPulled * 60000;
                Long millisToAddToNow = days + hours + minutes;
                Long futureDateInMillis = millisToAddToNow + nowInMillis;
                Long millisFromDate = futureDateInMillis - nowInMillis;

                return millisFromDate;
            }

原木猫:

E/AndroidRuntime(2283): FATAL EXCEPTION: main
E/AndroidRuntime(2283): java.lang.NumberFormatException: Invalid int: "2160000000"
E/AndroidRuntime(2283):     at java.lang.Integer.invalidInt(Integer.java:138)
E/AndroidRuntime(2283):     at java.lang.Integer.parse(Integer.java:378)
E/AndroidRuntime(2283):     at java.lang.Integer.parseInt(Integer.java:366)
E/AndroidRuntime(2283):     at java.lang.Integer.parseInt(Integer.java:332)
E/AndroidRuntime(2283):     at com.example.esomount.HomeActivity$bsTimer.onTick(HomeActivity.java:376)
E/AndroidRuntime(2283):     at android.os.CountDownTimer$1.handleMessage(CountDownTimer.java:124)

【问题讨论】:

  • 您不需要展示 32 位精度的进步。只需使用更粗粒度的度量即可。

标签: java android android-progressbar


【解决方案1】:

世界上没有理由每毫秒更新一次进度。将您的毫秒时间戳除以几个数量级,得出一个小于 int.maxSize() 的 int 值。

更好的是,根据您希望进度条运行多长时间,您可以将其分成 100 块,每块代表总进度的 1%。进度条的意义在于以人类可感知的规模随时间推移传达进度 - 世界上没有任何人能够准确地感知每秒 1000 次更新。

【讨论】:

  • 完美,我不敢相信我尝试过那样做。我不知道我在想什么。谢谢你,朋友。
【解决方案2】:

一种解决方法是使用 ProgressBar 从 0 缩放到 100,例如百分比,然后将时间进度转换为 0 到 100 之间的百分比。

【讨论】:

    【解决方案3】:

    在 32 天内显示毫秒分辨率是没有用的,除非您的显示器宽度超过 20 亿像素。

    获取进度条的宽度(近似值即可)并计算最大值和当前值的除数。

    例如,如果我的显示器是 960 像素宽,并且进度条是全宽的,没有任何类型的边框,我可以表示的最细粒度是最大值的 1/960th价值。

    如果我代表 32 天,那就是 2,764,800,000 毫秒。除以 960 得到 2,880,000。即单个像素所表示的时间,以毫秒为单位。

    因此,你会先setMax(960),然后是setProgress(yourValueInMillis/2880000)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-08-22
      • 2014-03-11
      • 2021-12-31
      • 2011-03-26
      • 1970-01-01
      • 2021-12-30
      • 2023-04-06
      相关资源
      最近更新 更多