2016-07-09 4 views
2

私は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で追加した後、前のアップデートと同じテストケースでかなり長い時間がかかることに気付きました。

+1

計算が十分速ければ、それよりも時間がかかるのはなぜですか? – Eenvincible

+0

私のルームメイトはそれを試していて、複数のオペレータで構成された計算が遅くなる傾向があることに気づいた。例えば、方程式が1、30回加算された場合、結果を得るには5秒以上かかります。私はmxparserがどのように計算を行うのかと関係があると思います。だから私は結果が来ていることをユーザーが知っているようにprogressDialogを表示したかったのです。 – mbobic

答えて

0

等しいボタンが押されてから遅延が発生することがわかっている場合は、代わりにProgressDialogを開始してみてください。

+0

これはonPreExecute – mbobic

+0

に入れるのと同じ効果があります。 'Expression expression = new Expression(equation);行の前で起動するとどうなるでしょうか? – Bill

+0

同じ効果があります – mbobic

関連する問題