2015-07-24 5 views
0

Я только что опубликовал приложение, которое я тестировал вчера. Приложение отлично работает на эмуляторах из Android Studio (за исключением, конечно, медленного), но приложение падает, если вы делаете определенную часть приложения (одна из основных функций).Android - приложение падает на Android-телефон, но не на Android-эмулятор (Android Studio)

Я тестировал его сегодня утром на эмуляторах, но все работает на моем ПК.

Я проверил код, который происходит во время этой аварии (см ниже), но не могу найти что-нибудь:

CalculateActivity

public class CalculateActivity extends ActionBarActivity { 

    TextView txtBewareTurnoverTime; 

    EditText txtPoolSize; 
    EditText txtTurnoverTime; 
    EditText txtTurnoverRate; 

    Button btnCalculate; 

    ImageButton imgBtnTurnoverTime, imgBtnTurnoverRate; 

    Animation shakeAni; 

    RelativeLayout layoutPoolSize, layoutTurnoverTime, layoutTurnoverRate; 
    LinearLayout layoutInfoTurnoverRate; 
    LinearLayout layoutInfoTurnoverTime; 

    boolean infoTurnoverRate = false; 
    boolean infoTurnoverTime = false; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_calculate); 

     FindAllById(); 
     SetListeners(); 
    } 

    //Finds all views by their ID and applies them to the variables 
    private void FindAllById() { 
     txtPoolSize = (EditText) findViewById(R.id.txtPoolSizeEdit); 
     txtTurnoverTime = (EditText) findViewById(R.id.txtTurnoverTimeEdit); 
     txtTurnoverRate = (EditText) findViewById(R.id.txtTurnoverRateEdit); 
     txtBewareTurnoverTime = (TextView) findViewById(R.id.txtInfoTurnoverTime); 
     layoutPoolSize = (RelativeLayout) findViewById(R.id.layoutPoolSize); 
     layoutTurnoverTime = (RelativeLayout) findViewById(R.id.layoutTurnoverTime); 
     layoutTurnoverRate = (RelativeLayout) findViewById(R.id.layoutTurnoverRate); 
     imgBtnTurnoverRate = (ImageButton) findViewById(R.id.imgBtnTurnoverRate); 
     imgBtnTurnoverTime = (ImageButton) findViewById(R.id.imgBtnTurnoverTime); 
     layoutInfoTurnoverRate = (LinearLayout) findViewById(R.id.layoutInfoTurnoverRate); 
     layoutInfoTurnoverRate.setVisibility(View.GONE); 
     layoutInfoTurnoverTime = (LinearLayout) findViewById(R.id.layoutInfoTurnoverTime); 
     layoutInfoTurnoverTime.setVisibility(View.GONE); 
    } 

    //Set the listeners on the various components 
    private void SetListeners(){ 
     btnCalculate = (Button) findViewById(R.id.calculateBtnCalcView); 
     btnCalculate.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       ShakeAnimation(); 
      } 
     }); 

     imgBtnTurnoverTime.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       if(!infoTurnoverTime){layoutInfoTurnoverTime.setVisibility(View.VISIBLE); infoTurnoverTime = true;} 
       else{layoutInfoTurnoverTime.setVisibility(View.GONE); infoTurnoverTime = false;} 
      } 
     }); 

     imgBtnTurnoverRate.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       if(!infoTurnoverRate){layoutInfoTurnoverRate.setVisibility(View.VISIBLE); infoTurnoverRate = true;} 
       else{layoutInfoTurnoverRate.setVisibility(View.GONE); infoTurnoverRate = false;} 
      } 
     }); 
    } 

    //Plays the animation for the correct relative layouts, if any 
    private void ShakeAnimation(){ 

     shakeAni = AnimationUtils.loadAnimation(CalculateActivity.this, R.anim.shake); 
     int switchInt = new AnimationHelper().CalculateAnimationInt(txtPoolSize.getText().toString(), txtTurnoverTime.getText().toString(), txtTurnoverRate.getText().toString()); 

     switch(switchInt){ 
      case 1: layoutPoolSize.startAnimation(shakeAni); 
        layoutTurnoverTime.startAnimation(shakeAni); 
        layoutTurnoverRate.startAnimation(shakeAni); 
       break; 
      case 2: layoutPoolSize.startAnimation(shakeAni); 
        layoutTurnoverTime.startAnimation(shakeAni); 
       break; 
      case 3: layoutPoolSize.startAnimation(shakeAni); 
        layoutTurnoverRate.startAnimation(shakeAni); 
       break; 
      case 4: layoutTurnoverTime.startAnimation(shakeAni); 
        layoutTurnoverRate.startAnimation(shakeAni); 
       break; 
      case 5: layoutPoolSize.startAnimation(shakeAni); 
       break; 
      case 6: layoutTurnoverTime.startAnimation(shakeAni); 
       break; 
      case 7: layoutTurnoverRate.startAnimation(shakeAni); 
       break; 
      case 8: StartResultActivity(); 
       break; 
     } 
    } 

    //Start the ResultActivity with the given variables 
    private void StartResultActivity(){ 
     Intent i = new Intent().setClass(CalculateActivity.this, ResultActivity.class); 
     i.putExtra("poolSize", txtPoolSize.getText().toString()); 
     i.putExtra("turnoverTime", txtTurnoverTime.getText().toString()); 
     i.putExtra("turnoverRate", txtTurnoverRate.getText().toString()); 
     startActivity(i); 
    } 
} 

ResultActivity

public class ResultActivity extends ActionBarActivity { 

    TextView resultPumpRequirement; 
    TextView resultFilterAreaRequirement; 
    TextView resultMinimumDiameterFilter; 

    Button btnFilters; 
    Button btnPumps; 

    String poolSize; 
    String turnoverTime; 
    String turnoverRate; 

    int pumpRequirement; 
    double filterAreaRequiment; 
    int minimumDiameterFilter; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_result); 


     Intent intent = getIntent(); 

     if(intent != null) { 
      poolSize = intent.getStringExtra("poolSize"); 
      turnoverTime = intent.getStringExtra("turnoverTime"); 
      turnoverRate = intent.getStringExtra("turnoverRate"); 

      Calculate(); 
      SetText(); 
      SetListeners(); 
     } 
    } 

    //Set the listeners on the various components 
    private void SetListeners() { 
     btnFilters = (Button) findViewById(R.id.btnFilters); 
     btnFilters.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(new URLHelper().CreateFilterURL(minimumDiameterFilter)))); 
      } 
     }); 

     btnPumps = (Button) findViewById(R.id.btnPumps); 
     btnPumps.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(new URLHelper().CreatePumpURL(pumpRequirement)))); 
      } 
     }); 
    } 


    //Calculates the variables using the custom Calculate helper class (CalculateResult) 
    private void Calculate(){ 
     CalculateHelper calcHelper = new CalculateHelper(poolSize, turnoverTime, turnoverRate); 

     pumpRequirement = calcHelper.CalculatePumpRequirement(); 
     filterAreaRequiment = calcHelper.CalculateFilterAreaRequirement(); 
     minimumDiameterFilter = calcHelper.CalculateMinimumDiameterFilter(); 
    } 

    //Applies everything to the view "activity_result" after being calculated 
    private void SetText(){ 

     resultPumpRequirement = (TextView) findViewById(R.id.resultPumpRequirement); 
     resultPumpRequirement.setText(Html.fromHtml(pumpRequirement + " m<sup><small>3</small></sup> per time")); 

     resultFilterAreaRequirement = (TextView) findViewById(R.id.resultFilterAreaRequirement); 
     resultFilterAreaRequirement.setText(Html.fromHtml(filterAreaRequiment + " m<sup><small>2</small></sup>")); 

     resultMinimumDiameterFilter = (TextView) findViewById(R.id.resultMinimumDiameterFilter); 
     resultMinimumDiameterFilter.setText(minimumDiameterFilter + "mm"); 
    } 
} 

Это два класса, которые на самом деле ничего не делают во время этой аварии. Я не могу найти ANY недостатки, и я надеялся, что некоторые из вас смогут что-то заметить.

Заранее благодарен!

+0

сообщение The StackTrace. – Raghunandan

+0

@Raghunandan Он падает на фактический телефон, который запретил это приложение из Google Play, а не на моем ПК. Могу ли я получить стек из телефона? – Detilium

+0

, если у вас есть какой-либо механизм для такого же типа, как Google crash analytics или crashlytics form fabric – Raghunandan

ответ

0

ПРОБЛЕМА решаемые

В качестве языка Locale был установлен датскому по телефону, программа заменена . с ,, который вызвал ошибку.

Я просто заменил мой код следующим:

//Calculates the minimum optimal filter area requirement 
public double CalculateFilterAreaRequirement(){ 
    CalculateTurnoverPerHour(); 
    double tmp = turnoverPerHour/turnoverRate; 
    filterAreaRequirement = Math.floor(tmp * 100)/100; 
    return filterAreaRequirement; 
} 
Смежные вопросы