私はAndroidで最初のプロジェクトの電卓アプリを開発しています。式の中にいくつのオペランドを入れるかによって、計算に時間がかかることがあります。 mxparser apiを使って方程式を評価しています。 progressDialog
は私のasyncTask
の間に表示されるはずですが、何分の1秒かしか表示されません。ProgressDialogは1秒未満で表示されます。
私は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);
}
}
}
更新7/14/16: 実際の計算自体は全く時間はかかりませんようです。しかし等号ボタンが押されてから、結果が表示されるまでに時間がかかります。 1 + 1の長い文字列の場合は3秒(私のテストで33個の追加)、文字列がそれよりも長い場合は長い。
更新日7/18/16: 私はprogressDialog
が表示されない理由を見つけました。 doCalculation
メソッドでは、の前に、equation.checkSyntax()
という構文をチェックしています。これは私の遅れが出てきた場所なので、asyncTask
は大部分の作業をしていませんでした。 asyncTask
で追加した後、前のアップデートと同じテストケースでかなり長い時間がかかることに気付きました。
計算が十分速ければ、それよりも時間がかかるのはなぜですか? – Eenvincible
私のルームメイトはそれを試していて、複数のオペレータで構成された計算が遅くなる傾向があることに気づいた。例えば、方程式が1、30回加算された場合、結果を得るには5秒以上かかります。私はmxparserがどのように計算を行うのかと関係があると思います。だから私は結果が来ていることをユーザーが知っているようにprogressDialogを表示したかったのです。 – mbobic