我无法计算平均打字率(每分钟字符数)

时间:2016-12-07 12:00:57

标签: java android

我无法计算平均打字率(每分钟字符数)。 有时数字太小有时数字太大。 当我在模拟器上运行时,数字非常小; 当我在手机上运行时,数字非常大。 请帮忙。

package com.example.typeit;

import android.os.SystemClock;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.text.Editable;
import android.text.TextWatcher;
import android.util.Log;
import android.view.KeyEvent;
import android.view.View;
import android.widget.EditText;
import android.widget.ProgressBar;
import android.widget.TextView;

import java.util.Date;

public class MainActivity extends AppCompatActivity {
TextView test, min;
EditText input;
long startTime;
double sTime, tTime;
boolean isStarted;
//ProgressBar progressBar;
int count;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    input = (EditText) findViewById(R.id.input);
    min = (TextView) findViewById(R.id.min);
    //progressBar = (ProgressBar) findViewById(R.id.progress);

    input.setOnKeyListener(keyListener);
    isStarted = true;
    count = 0;
}

View.OnKeyListener keyListener = new View.OnKeyListener() {
    @Override
    public boolean onKey(View v, int keyCode, KeyEvent event) {
        if (event.getAction() == event.ACTION_DOWN) {
            if (isStarted) {
                sTime = new Date().getTime();
                isStarted = false;
                return false;
            }
            //if(keyCode == event.KEYCODE_SHIFT_LEFT) return false;
            if (Character.isUpperCase(input.getText().charAt(count))) {
                if (input.getText().toString().charAt(count) != keyCode + 36) {
                    min.setText("");
                } else {
                    min.setText("");
                }
            } else if (Character.isLowerCase(input.getText().charAt(count))) {
                if (input.getText().toString().charAt(count) != keyCode + 68) {
                    min.setText("");
                } else {
                    min.setText("");
                }
            }
            if (keyCode == KeyEvent.KEYCODE_DEL) count--;
            else count++;

            tTime = (new Date().getTime() - sTime) / 1000 / 60;

            int result = (int) (count / tTime);
            if (result < 0) result = 0;
            //      progressBar.setProgress(result);
            if (count == input.getText().toString().length()) {
                input.setText("");
                min.setText("" + result);
            }
        }
        return false;
    }
};
}

1 个答案:

答案 0 :(得分:1)

众所周知,android模拟器非常慢。因此测量打字率不准确。

接下来,我强​​烈建议从处理的其余部分中提取打字率的测量值。换句话说:你的onKey监听器正在处理很多责任。将计算重构为一个新类,如:

class TypeRateCalculator(){
    private Date startTime;
    private Date elapsedTime;
    private int characterCount = 0;

    public void startMeasuring() {
        startTime = new Date();
    }

    public int updateTypingRate() {
        characterCount++;
        elapsedTime = new Date();
        long delta = (elapsedTime.getTime() - startTime.getTime()) / 1000 / 60;
        int typingRate = Math.max(0, (int) (characterCount/ delta ));
        return typingRate;
    }
}

然后在keyListener中调用updateTypingRate()。

最后:如果if语句与else语句的作用相同,则可以删除整个分支并直接执行这些操作:

if (x) {
    foo();
}
else {
    foo();
}

与:

相同
foo()