而(true)循环迫使我的应用程序在Android中崩溃



我正在尝试实现一个无限循环,因为我希望代码一次又一次地运行下面的代码......但它导致我的应用程序崩溃...由于我是这项技术的初学者,我不知道这一点......任何帮助将不胜感激。谢谢。。

这是日志猫

  06-20 22:04:38.029 22848-22848/sensor.swapni E/AndroidRuntime: FATAL 
  EXCEPTION: main
                                                           Process: 
   sensor.swapni, PID: 22848
   java.lang.OutOfMemoryError: Failed to allocate a 13571692 byte allocation 
   with 7716072 free bytes and 7MB until OOM
                                                               at 
   java.util.ArrayList.add(ArrayList.java:118)
                                                               at 
   android.view.ViewRootImpl$RunQueue.postDelayed(ViewRootImpl.java:8656)
                                                               at 
   android.view.View.postDelayed(View.java:14275)
                                                               at 
   sensor.swapni.Second.onCreate(Second.java:54)
                                                               at 
   android.app.Activity.performCreate(Activity.java:6904)
                                                               at 
android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1136)
                                                               at 
android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3266)
                                                               at 
 android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3415)
                                                               at   
android.app.ActivityThread.access$1100(ActivityThread.java:229)
                                                               at 
android.app.ActivityThread$H.handleMessage(ActivityThread.java:1821)
                                                               at 
android.os.Handler.dispatchMessage(Handler.java:102)
                                                               at 
android.os.Looper.loop(Looper.java:148)
                                                               at 
android.app.ActivityThread.main(ActivityThread.java:7325)
                                                               at 
java.lang.reflect.Method.invoke(Native Method)
                                                               at 

这是java代码

 while(true) {
        tv1.postDelayed(new Runnable() {
            @Override
            public void run() {
                tv1.setVisibility(View.INVISIBLE);
                tv2.setVisibility(View.VISIBLE);
            }
        }, 1000);
        tv1.postDelayed(new Runnable() {
            @Override
            public void run() {
                tv2.setVisibility(View.INVISIBLE);
                tv1.setVisibility(View.VISIBLE);
            }
        }, 2000);

该循环每秒将运行数千次。 每次运行时,它都会向堆中添加至少 4 个对象(2 个可运行对象,2 个消息到处理程序(。 最终你会耗尽内存。

如果你想每 2 秒连续做一次事情,你可以在实际线程上调用 postDelay,然后在可运行线程中再次调用它。 喜欢这个:

   tv1.postDelayed(new Runnable() {
        @Override
        public void run() {
            tv1.setVisibility(View.INVISIBLE);
            tv2.setVisibility(View.VISIBLE);
            tv1.postDelayed(this, 1000);
        }
    }, 1000);

将以下两个方法添加到类中:

private void setVisibility1() {
    tv1.setVisibility(View.INVISIBLE);
    tv2.setVisibility(View.VISIBLE);
    tv1.postDelayed(new Runnable() {
        @Override
        public void run() {
            setVisibility2();
        }
    }, 1000);
}
private void setVisibility2() {
    tv1.setVisibility(View.VISIBLE);
    tv2.setVisibility(View.INVISIBLE);
    tv1.postDelayed(new Runnable() {
        @Override
        public void run() {
            setVisibility1();
        }
    }, 1000);
}

并将整个循环替换为对此方法的一个调用:

setVisibility1();

setVisibility1 切换可见性并启动 setVisibility2 的计时器。当执行 setVisibility2 时,它会再次更改可见性并启动 setVisibility1 的计时器。

这很可能是内存不足的问题。尝试设置一个计时器,而不是创建大量新对象。

http://java.sun.com/javase/6/docs/api/java/util/Timer.html

当你在主线程内进行操作时,你不应该在主线程中使用它。你可能不得不使用类似的东西。

   viewModelScope.launch(Dispatchers.IO) {
        while (statues==true){
            if (statue==true){
                delay(500)
                   //ToDo

             }
        }
}

最新更新