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

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;
    }
};
}

最佳答案

已知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()

10-08 02:59