首页 > 解决方案 > 一旦计时器达到0,计算每分钟的频率

问题描述

更新 - 下面的解决方案

我是 Java 新手(和整个编程),真的可以使用一些帮助。

我正在研究一个包含计时器和计数器的片段。用户在编辑文本中输入一个数字并点击“设置”按钮以将计时器设置为以分钟为单位的数字。还有一个频率计数器,每次单击它都会增加 1。当计时器达到零时,我想要一个“速率”文本视图来显示将按钮被点击的次数除以分钟数的结果;速率 = 频率/分钟。例如:如果分钟 = 5 和频率 = 7,我希望速率文本视图显示“0.71”。

到目前为止,我已经让计时器和计数器工作了,但我无法让费率计算工作。我不断得到“无穷大”,这从我所读到的意思是我正在除以一个整数。我不知道哪个数字仍然是整数。我也不确定我的代码布局是否正确(也许我在声明不应该的地方?)

任何帮助将不胜感激。提前致谢!

我尝试使用 try/catch 语句来避免除以 0。在 XML 中,我尝试将输入类型设置为“numberDecimal”我尝试在转换之前将编辑文本转换为整数和文本视图转换为字符串到双打我尝试将编辑文本和计数器直接转换为双打。我搜索了 stackoverflow、Quora 和 YouTube 以确保我的计算正确。

解决方案

@Override
            public void onFinish() {
                mTimerRunning = false;
                button_start_pause.setText("Start");
                button_start_pause.setVisibility(android.view.View.INVISIBLE);
                button_reset.setVisibility(android.view.View.VISIBLE);
                text_view_rate.setVisibility(android.view.View.VISIBLE);
                calculaterate();
            }
        }.start();

        mTimerRunning = true;
        button_start_pause.setText("Pause");
    }

    public void pauseTimer() {
        countDownTimer.cancel();
        mTimerRunning = false;
        button_start_pause.setText("Start");
        updateCountDownText();
    }

    public void resetTimer() {
        if (mTimerRunning) {
            countDownTimer.cancel();
            mTimeLeftInMillis = (mStartTimeInMillis + 1000);
            updateWatchInterface();
            startTimer();
        } else {
            mTimeLeftInMillis = (mStartTimeInMillis);
            updateCountDownText();
            updateWatchInterface();
            button_reset.setVisibility(android.view.View.VISIBLE);
            button_start_pause.setVisibility(android.view.View.VISIBLE);
        }
    }

    public void calculaterate() {
        double numerator = Double.parseDouble(text_view_frequency.getText().toString());
        double denominator = (mStartTimeInMillis/1000)/60;
        double rate = (numerator)/(denominator);
        DecimalFormat df = new DecimalFormat("#.00");
        String ratecalc = df.format(rate);
        text_view_rate.setText(ratecalc);
    }

片段和组件 ID

public class fragmentrate extends Fragment {
    private EditText edit_text_input;
    private TextView text_view_countdown;
    private TextView text_view_frequency;
    private TextView text_view_rate;
    private TextView rate_equals;
    private Button button_start_pause;
    private Button button_reset;
    private Button button_set;
    private Button button_frequency;
    private Button button_reset_frequency;
    private CountDownTimer countDownTimer;
    private boolean mTimerRunning;
    private long mStartTimeInMillis;
    private long mTimeLeftInMillis = mStartTimeInMillis;
    private long mEndTime;
    private int mCounter;
    private double denominator;

    View View;

    public View onCreateView(@NonNull LayoutInflater inflater, @NonNull ViewGroup container, @NonNull Bundle savedInstanceState) {
        View = inflater.inflate(R.layout.rate_fragment, container, false);

        text_view_countdown = View.findViewById(R.id.text_view_countdown);
        button_start_pause = View.findViewById(R.id.button_start_pause);
        button_reset = View.findViewById(R.id.button_reset);
        button_frequency = View.findViewById(R.id.button_frequency);
        button_reset_frequency = View.findViewById(R.id.button_reset_frequency);
        edit_text_input = View.findViewById(R.id.edit_text_input);
        button_set = View.findViewById(R.id.button_set);
        text_view_frequency = View.findViewById(R.id.text_view_frequency);
        text_view_rate = View.findViewById(R.id.text_view_rate);
        rate_equals = View.findViewById(R.id.rate_equals);

频率计数器

button_frequency.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(android.view.View view) {
                mCounter ++;
                text_view_frequency.setText(Integer.toString(mCounter));
            }
        });

        button_reset_frequency.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(android.view.View view) {
                mCounter = 0;
                text_view_frequency.setText(Integer.toString(mCounter));
            }
        });

计时器和费率计算

button_set.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(android.view.View view) {
                String input = edit_text_input.getText().toString();
                if (input.length() == 0) {
                    Toast.makeText(getActivity(), "Please enter a number", Toast.LENGTH_SHORT).show();
                    return;
                }
                long millisInput = Long.parseLong(input) * 60000;
                if (millisInput == 0) {
                    Toast.makeText(getActivity(), "Please enter a positive number", Toast.LENGTH_SHORT).show();
                    return;
                }

                setTime(millisInput);
                edit_text_input.setText("");
            }
        });

        button_start_pause.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(android.view.View view) {
                if (mTimerRunning) {
                    pauseTimer();
                } else {
                    startTimer();
                }
            }
        });

        button_reset.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(android.view.View view) {
                if(mTimerRunning) {
                    resetTimer();
                } else{
                    resetTimer();
                }
            }
        });
        return View;
    }

    private void setTime(long milliseconds) {
        mStartTimeInMillis = milliseconds;
        resetTimer();
    }

    private void startTimer() {
        mEndTime = System.currentTimeMillis() + mTimeLeftInMillis;
        countDownTimer = new CountDownTimer(mTimeLeftInMillis, 100) {
            @Override
            public void onTick(long millisUntilFinished) {
                mTimeLeftInMillis = millisUntilFinished;
                updateCountDownText();
            }

            @Override
            public void onFinish() {
                mTimerRunning = false;
                button_start_pause.setText("Start");
                button_start_pause.setVisibility(android.view.View.INVISIBLE);
                button_reset.setVisibility(android.view.View.VISIBLE);

                 try {
                double denominator = Integer.parseInt(edit_text_input.getText().toString());
                double rate = ((double)mCounter/denominator);
                text_view_rate.setText(Double.toString(rate));
            }
            catch (NumberFormatException e)
            {

            }
        }
    }.start();
mTimerRunning = true;
        button_start_pause.setText("Pause");
    }

    private void pauseTimer() {
        countDownTimer.cancel();
        mTimerRunning = false;
        updateCountDownText();
        button_start_pause.setText("Start");
    }

    private void resetTimer() {
        if (mTimerRunning) {
            countDownTimer.cancel();
            mTimeLeftInMillis = (mStartTimeInMillis + 1000);
            updateWatchInterface();
            startTimer();
        } else {
        }
        mTimeLeftInMillis = (mStartTimeInMillis);
        updateCountDownText();
        updateWatchInterface();
        button_reset.setVisibility(android.view.View.VISIBLE);
        button_start_pause.setVisibility(android.view.View.VISIBLE);
    }

    private void updateCountDownText() {
        int minutes = (int) (mTimeLeftInMillis/1000)/60;
        int seconds = (int) (mTimeLeftInMillis/1000)%60;

        String timeLeftFormatted = String.format(Locale.getDefault(),
                timeLeftFormatted = String.format(Locale.getDefault(), "%02d:%02d", minutes, seconds));
        text_view_countdown.setText(timeLeftFormatted);
    }

我预计 5/7 的输出为 0.71,但实际输出为“Infinity”

标签: javatimerdoublecalculatorrate

解决方案


推荐阅读