Android应用程序在while循环中崩溃

Android应用程序在while循环中崩溃,android,Android,我正在制作这个应用程序,它告诉我们到达目的地还有多久,但每当我尝试使用它时,它只是黑屏崩溃。我认为这与循环有关,但我在网上找不到任何东西,有人能帮忙吗?提前感谢 package com.example.myapplication; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.widget.TextView; import java.util.Calendar

我正在制作这个应用程序,它告诉我们到达目的地还有多久,但每当我尝试使用它时,它只是黑屏崩溃。我认为这与循环有关,但我在网上找不到任何东西,有人能帮忙吗?提前感谢

package com.example.myapplication;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.TextView;

import java.util.Calendar;
import java.util.TimeZone;
import java.time.*;
import java.math.*;

public class TimeTIll extends AppCompatActivity {
    private static final String DateUtils = null;
    TextView txt;

    @Override

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_time_till);
        txt = (TextView) findViewById(R.id.TimeDipslay);
        int i = 0;
        while (i < 10) {
            Program();
            i++;
            try {
                Thread.sleep(1000);
            } catch (InterruptedException ex) {
                Thread.currentThread().interrupt();
            }
        }
    }

    public void Program() {

        int totalMinutesSinceMidnight = 0;
        long ms = 0;
        long secondsM = 0;
        long SecondsTillEstimate = 0;
        long SecondsTillArrival1 = 0;
        double MinutesTillArrival = 0;
        double hoursTillArrival = 0;
        double SecondsTillArrival = 0;
        Calendar now = Calendar.getInstance();
        Calendar midnight = Calendar.getInstance();
        midnight.set(Calendar.HOUR_OF_DAY, 0);
        midnight.set(Calendar.MINUTE, 0);
        midnight.set(Calendar.SECOND, 0);
        midnight.set(Calendar.MILLISECOND, 0);
        try {
            Thread.sleep(2000);
        } catch (InterruptedException ex) {
            Thread.currentThread().interrupt();
        }


        now = Calendar.getInstance();
        midnight = Calendar.getInstance();

        ms = now.getTime().getTime() - midnight.getTime().getTime();
        totalMinutesSinceMidnight = (int) (ms / 1000);
        secondsM = totalMinutesSinceMidnight;

        SecondsTillEstimate = (60 * 60 * 23);
        SecondsTillArrival1 = SecondsTillEstimate - secondsM;
        hoursTillArrival = Math.floor(SecondsTillArrival1 / 3600);
        SecondsTillArrival1 -= (hoursTillArrival * 3600);
        MinutesTillArrival = Math.floor(SecondsTillArrival1 / 60);
        SecondsTillArrival1 -= (MinutesTillArrival * 60);
        SecondsTillArrival = SecondsTillArrival1;
        txt.setText((int) hoursTillArrival + " Hours " + (int) MinutesTillArrival + " Minutes " + (int) SecondsTillArrival + " Seconds Till Arrival In Floriada");

    }


}
package com.example.myapplication;
导入android.support.v7.app.AppActivity;
导入android.os.Bundle;
导入android.widget.TextView;
导入java.util.Calendar;
导入java.util.TimeZone;
导入java.time.*;
导入java.math.*;
公共类TimeTIll扩展AppCompative活动{
私有静态最终字符串DateUtils=null;
文本视图;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity\u time\u-till);
txt=(TextView)findViewById(R.id.TimeDipslay);
int i=0;
而(i<10){
程序();
i++;
试一试{
睡眠(1000);
}捕获(中断异常例外){
Thread.currentThread().interrupt();
}
}
}
公共空间计划(){
整数总分钟数=0;
长ms=0;
长二次SM=0;
长估计=0;
长二次流L1=0;
双分钟到达=0;
双时距=0;
双倍到达时间=0;
Calendar now=Calendar.getInstance();
日历午夜=Calendar.getInstance();
午夜。设置(日历。一天中的小时,0);
午夜。设置(日历。分钟,0);
午夜。设置(日历秒,0);
午夜。设置(日历毫秒,0);
试一试{
《睡眠》(2000年);
}捕获(中断异常例外){
Thread.currentThread().interrupt();
}
现在=Calendar.getInstance();
午夜=Calendar.getInstance();
ms=now.getTime().getTime()-midnight.getTime().getTime();
总分钟数=(整数)(毫秒/1000);
secondsM=午夜后的总分钟数;
第二估算=(60*60*23);
SecondStillArrivalL1=SecondsTillEstimate-secondsM;
hoursTillArrival=数学楼层(1/3600);
第二次到达时间1-=(小时到达时间*3600);
MinutesTillArrival=数学楼层(第二层/第60层);
第二次到达时间1-=(分钟到达时间*60);
SecondsTillArrival=SecondStillArrivalL1;
txt.setText((int)hoursTillArrival+“Hours”+(int)MinutesTillArrival+“Minutes”+(int)SecondsTillArrival+“到达Floriada前的秒数”);
}
}
请阅读有关该项目的信息。您不能在
onCreate
中调用长时间运行的任务,并期望它们显示除ANR崩溃以外的任何内容(您的
onCreate
方法使用所有这些sleep语句阻塞UI线程,并在到达实际显示活动的
onStart
onResume
阶段之前生成ANR崩溃).

如果希望UI动态更改,可以使用处理程序定期执行方法。例如,要定期(此处为1000 ms)更新某些内容,您可以执行以下操作:

public class MainActivity extends AppCompatActivity {

    private final Handler handler = new Handler();
    private TextView txt;
    private int count = 0;
    private final int updateFreqMs = 1000; // call update every 1000 ms

    @Override
    protected void onPause() {
        super.onPause();
        handler.removeCallbacksAndMessages(null);
    }

    @Override
    protected void onResume() {
        super.onResume();
        handler.postDelayed(new Runnable() {
            @Override
            public void run() {
                updateTime();
                handler.postDelayed(this, updateFreqMs);
            }
        }, updateFreqMs);
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_time_till);
        txt = findViewById(R.id.TimeDipslay);
    }

    private void updateTime() {
        // here you update the displayed value
        // this will be called every second indefinitely
        // do your math and generate a string to print, just showing
        // a counter here to demonstrate
        ++count;
        txt.setText("Count = " + count);
    }
}

我认为问题在于您试图将睡眠作为应用程序的主线程。在安卓系统中,我知道出于安全原因,这无法实现。 (详情请看此)

请尝试以下解决方案: