我正在为我的第一个带有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
中添加它之后,我注意到与之前的更新相同的测试用例需要相当长的时间。
答案 0 :(得分:0)
如果您知道从按下等号按钮开始发生延迟,为什么不将ProgressDialog移动到那里呢?