【问题标题】:Android - App crashes on android phone but not on Android Emulator (Android Studio)Android - 应用程序在 android 手机上崩溃,但在 Android Emulator (Android Studio) 上没有
【发布时间】:2015-07-24 06:36:47
【问题描述】:

我刚刚发布了一个应用程序,我昨天测试了它。该应用在 Android Studio 的模拟器上运行完美(当然速度慢除外),但如果在应用上执行特定部分(主要功能之一),应用会崩溃。

我今天早上在模拟器上再次测试了它,但一切都在我的电脑上运行。

我检查了此崩溃期间发生的代码(请参阅下文),但似乎找不到任何东西:

计算活动

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);
    }
}

结果活动

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 缺陷,我希望你们中的一些人能够发现任何东西。

提前致谢!

【问题讨论】:

  • 发布堆栈跟踪。
  • @Raghunandan 它在从 Google Play 下载此应用程序的实际手机上崩溃,而不是在我的 PC 上。我可以从手机获取堆栈跟踪信息吗?
  • 如果您有任何相同的机制,例如 google crash analytics 或 crashlytics form fabric
  • 将手机连接到计算机并在 Eclipse 中设置过滤器以仅显示您所说的在手机中崩溃的此应用程序的日志。当应用程序崩溃时,它会在 logcat 窗口中记录异常详细信息(如果您使用的是 Android Studio,则为等效项)。通过这种方式,您可以获得异常详细信息。请在此处发布异常详细信息,以便我们提供帮助。
  • 问题是我正在使用的手机无法连接到PC,我在朋友的手机上测试过。我目前正在购买一部手机。

标签: android android-studio crash google-play


【解决方案1】:

问题已解决

由于在手机上将语言Locale 设置为丹麦语,程序将. 替换为,,从而导致错误。

我只是用以下代码替换了我的代码:

//Calculates the minimum optimal filter area requirement
public double CalculateFilterAreaRequirement(){
    CalculateTurnoverPerHour();
    double tmp = turnoverPerHour/turnoverRate;
    filterAreaRequirement = Math.floor(tmp * 100) / 100;
    return filterAreaRequirement;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-17
    • 2022-07-18
    • 2018-12-01
    • 1970-01-01
    • 2017-05-12
    相关资源
    最近更新 更多