延迟会使应用崩溃



我在 MainActivity 中有这段代码:

  boolean running = true;
    @Override
    public void onClick(View v) {
        Button button = (Button)findViewById(R.id.start);
        new Thread(new Runnable() {
            public void run() {
                int secs = 1;
                while(running){
                    Utils.delay(secs, new Utils.DelayCallback() {
                        int  seconds = 0;
                        TextView licznik = (TextView)findViewById(R.id.licznik);
                        @Override
                        public void afterDelay() {
                            seconds = seconds + 1;
                            licznik.setText(Integer.toString(seconds));
                        }
                    });

                }
            }
        }).start();

    }

及其 Utils 类:

    import android.os.Handler;
public class Utils {
    // Delay mechanism
    public interface DelayCallback{
        void afterDelay();
    }
    public static void delay(int secs, final DelayCallback delayCallback){
        Handler handler = new Handler();
        handler.postDelayed(new Runnable() {
            @Override
            public void run() {
                delayCallback.afterDelay();
            }
        }, secs * 1000); // afterDelay will be executed after (secs*1000) milliseconds.
    }
}

我在 StackOverflow 上找到了这种方法,但在我单击按钮后它使我的应用程序崩溃怎么了?请帮忙,如果我应该做另一种延迟方法,告诉我哪个错误:

java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()

您正在未调用Looper.prepare()的后台Thread上创建一个Handler,并且还接触了主线程之外的UI组件。

尝试:

Handler handler = new Handler(Looper.getMainLooper());
        handler.postDelayed(new Runnable() {
            @Override
            public void run() {
                delayCallback.afterDelay();
            }
        }, secs * 1000);

看看这是否能解决问题。 但是,无论哪种方式,您都可能会遇到问题,因为while(running)呼叫将在没有睡眠的情况下触发很多......

最新更新