ProgressDialog显示几分之一秒,如果有的话

时间:2016-07-09 19:39:31

标签: android

我正在为我的第一个带有android的项目开发一个计算器应用程序。一些计算需要一段时间,因为在等式中放置了多少个操作数。我正在使用mxparser api来评估等式。一个progressDialog应该在我的asyncTask期间显示,但它只显示一小段时间,如果有的话。

我已尝试过stackoverflow上的其他解决方案,到目前为止还没有任何工作。关于为什么会发生这种情况的任何想法?

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

private EditText editScreen;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    editScreen = (EditText) findViewById(R.id.calculator_display);
    Button btnEq = (Button) findViewById(R.id.btn_equals);
    btnEq.setOnClickListener(this);
}


@Override
public void onClick(View v) {
    String equation = editScreen.getText().toString();

    switch (v.getId()) {

        case R.id.btn_equals:
            doCalculation(equation);
            break;

        default:
            Log.e("ERROR", "button was not implemented: " + v.getId());
    }
}

private void doCalculation(String equation) {
    Expression expression = new Expression(equation);
    boolean isCorrectSyntax = expression.checkSyntax();
    if (isCorrectSyntax) {
        new calcAsync(MainActivity.this, equation).execute(expression);
    } else {
        Toast.makeText(getApplicationContext(), "Error in expression, please check syntax", Toast.LENGTH_LONG).show();
    }
}

private class calcAsync extends AsyncTask<Expression, Void, Void> {

    private ProgressDialog dialog;
    private String equation;

    private String answer;

    public calcAsync(Context context, String equation) {

        this.equation = equation;
    }

    @Override
    protected Void doInBackground(Expression... params) {
        Log.d("DEV", "starting calculation");
        Double result = params[0].calculate();
        String[] r = result.toString().split("\\.");

        if (result.equals(Double.NaN) || result.equals(Double.NEGATIVE_INFINITY) || result.equals(Double.POSITIVE_INFINITY)) {
            answer = result.toString();
        } else if (r[1].length() == 1 && Integer.parseInt(r[1]) == 0) {
            answer = r[0];
        } else {
            answer = result.toString();
        }


        return null;
    }

    @Override
    protected void onPreExecute() {
        super.onPreExecute();

        dialog = new ProgressDialog(MainActivity.this);
        dialog.setIndeterminate(true);
        dialog.setCancelable(false);
        dialog.setMessage("Calculating...");
        dialog.setTitle("Please wait...");
        dialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
        dialog.show();

        Log.d("DEV", "dialog shown");

    }

    @Override
    protected void onPostExecute(Void aVoid) {
        super.onPostExecute(aVoid);
        if (dialog != null) {
            Log.d("DEV", String.valueOf(dialog.isShowing()));
            dialog.dismiss();
            Log.d("DEV", "Dialog dismissed");
        }
        editScreen.setText(answer);
        saveToHistory(equation, answer);
    }
}

}

2016年7月14日更新: 似乎实际计算本身并不需要很长时间。但是从按下等于按钮之后的时间开始,直到显示结果需要一段时间。 3 + 1长串1 + 1 ...(在我的测试中添加33个),如果字符串长于此值则更长。

2016年7月18日更新: 我发现了progressDialog没有显示的原因。在doCalculation方法中,我在equation.checkSyntax()之前使用asyncTask检查语法。这是我延迟的来源,因此asyncTask没有完成大部分工作。在asyncTask中添加它之后,我注意到与之前的更新相同的测试用例需要相当长的时间。

1 个答案:

答案 0 :(得分:0)

如果您知道从按下等号按钮开始发生延迟,为什么不将ProgressDialog移动到那里呢?