簡體   English   中英

while(true)loop迫使我的應用在Android中崩潰

[英]while(true)loop is forcing my app to crash in Android

我正在嘗試實現無限循環,因為我希望代碼一次又一次地運行以下代碼...但是這導致我的應用崩潰...因為我是這項技術的初學者,所以我不知道這一點...任何幫助將不勝感激..謝謝

這是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);

該循環每秒將運行數千次。 每次運行時,它都會向堆中添加至少4個對象(2個Runnables,2個消息至處理程序)。 最終,您的內存不足。

如果要每2秒連續執行某項操作,請在實際線程上調用一次postDelayed,然后在可運行內部調用該函數。 像這樣:

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

這很可能是內存不足的問題。 嘗試設置計時器,而不要創建大量新對象。

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

將這兩個方法添加到您的類中:

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的計時器。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM