2017-06-20 24 views
0

我想實現一個無限循環,因爲我想要代碼一次又一次運行follwing代碼......但它導致我的應用程序崩潰.. 。正如我在這個高科技初學者,我不知道這...任何幫助將appreciated..thank你..while(true)loop迫使我的應用程序崩潰在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); 
+1

您可以發佈您收到的錯誤嗎? @Alex – cunniemm

+0

你在這裏試圖做什麼 – Tony

+0

這將是因爲你的循環執行速度遠遠超過了android可以處理所有這些任務,所以任務會填滿隊列,最終這會失敗並出現某種QueueOverflow異常,或者你的JVM會只是耗盡內存。 –

回答

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

+0

錯誤:方法引用不支持-source 7.0 ...你可以建議我任何其他替代tv1.postDelayed(this :: setVisibility1,1000); },因爲它顯示錯誤,當我試圖運行應用程序使用這種方法... – Alex

+0

@Alex編輯爲Java7。公平地說:如果你有機會獲得目前的知名度,Gabe Sechan的解決方案更加乾淨。 –

+0

它像一個魅力!!!!謝謝... – Alex

3

該循環將運行每秒數千次。每次運行時,它會向堆中添加至少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); 
+0

確切地說,除此之外,每2秒兩個文本瀏覽都設置爲同時可見和不可見的兩個Runnables(不是暗戀原因,但仍然出現錯誤,如果您想在說明中添加:)) –

+0

正確。他可能想要第一個可運行的帖子,第二個帖子和第二個帖子是第一個。 –

+0

現在,我很好奇。哪一個會首先發生:OutOfMemory異常或ANR? –