我正在尝试实现无限循环,因为我希望代码一次又一次地运行以下代码...但它导致我的应用程序崩溃...因为我是这个技术的初学者,我不是意识到这一点...任何帮助将不胜感激..谢谢你...
这是Logcat
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);
答案 0 :(得分:3)
该循环每秒运行数千次。每次运行时,它都会向堆中添加至少4个对象(2个Runnables,2个消息到处理程序)。最终你的内存不足。
如果你想每2秒钟继续做一些事情,你可以在实际线程上调用postDelayed一次,然后在runnable中再次调用它。像这样:
tv1.postDelayed(new Runnable() {
@Override
public void run() {
tv1.setVisibility(View.INVISIBLE);
tv2.setVisibility(View.VISIBLE);
tv1.postDelayed(this, 1000);
}
}, 1000);
答案 1 :(得分:0)
很可能是内存不足问题。尝试设置一个计时器,而不是创建大量的新对象。
答案 2 :(得分:0)
将这两种方法添加到您的班级中:
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的计时器。