ProgressBar.setProgress是否接受整数?

时间:2014-07-02 23:51:33

标签: java android android-progressbar

所以,我的应用程序崩溃是因为“java.lang.NumberFormatException:Invalid int:”2160000000“,我的理解是最大可能的整数是2,147,483,647。所以,显然它崩溃了,因为我试图setProgress on ProgressBar的int太大了。

我的问题是:有解决方法吗? int很大,因为我将DAYS,HOURS和MINUTES转换为millis。 因此,当我输入大于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转换为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;
            }

Log Cat:

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)

3 个答案:

答案 0 :(得分:1)

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

更好的是,根据您期望进度条运行的时间长短,您可以将其分为100个部分,每个部分代表总进度的1%。进度条的重点是在人类可感知的范围内随时间推移进展 - 世界上没有任何人能够准确地感知到每秒1000次更新。

答案 1 :(得分:1)

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

答案 2 :(得分:1)

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

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

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

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

因此,您需要setMax(960),然后setProgress(yourValueInMillis/2880000)