2015-08-30 35 views
0

該方法從內置圖庫中提取圖像並將其以紋理的形式提交給屏幕。我還將選擇的圖像存儲在每次用戶進入該屏幕時要顯示的文件中。問題是,當我上傳,讓說,在連續3個圖像,我收到控制檯內存警告,後來導致應用程序崩潰是由於內存錯誤:由於圖像存儲引起的內存崩潰

AppLauncher failed with an exception: java.lang.RunTimeException: The app crashed: Terminated due to Memory Error

很難查明這種情況的確切原因。但是我已經調試並記錄了一點,似乎沒有將圖像寫入文件導致它。它與刪除已存在的圖像然後上載替換的動作更相關。當我讓用戶刪除他們的圖像時,整個文件被刪除並且紋理被丟棄。我還注意到,當用戶上傳了一些圖像並退出屏幕時,它會因爲內存錯誤而崩潰。所有的

FileHandle fileIOS1 = Gdx.files.external("iosImage1.png"); 
    FileHandle fileIOS2 = Gdx.files.external("iosImage2.png"); 
    FileHandle fileIOS3 = Gdx.files.external("iosImage3.png"); 
    FileHandle fileIOS4 = Gdx.files.external("iosImage4_.png"); 
    FileHandle fileIOS5 = Gdx.files.external("iosImage5.png"); 
    FileHandle fileIOS6 = Gdx.files.external("iosImage6.png"); 
    FileHandle fileIOS7 = Gdx.files.external("iosImage7.png"); 
    FileHandle fileIOS8 = Gdx.files.external("iosImage8.png"); 
    FileHandle fileIOS9 = Gdx.files.external("iosImage9.png"); 
    FileHandle fileIOS10 = Gdx.files.external("iosImage10.png"); 
    FileHandle fileIOS11 = Gdx.files.external("iosImage11.png"); 
    FileHandle fileIOS12 = Gdx.files.external("iosImage12.png"); 

    public GalleryScreen(MainClass game) { 
    if(game.isIOS()){ 
     if(fileIOS1.exists()) { 
      imageSelected1 = new Texture(fileIOS1); 
     } 
     if(fileIOS2.exists()) { 
      imageSelected2 = new Texture(fileIOS2); 
     } 
     if(fileIOS3.exists()) { 
      imageSelected3 = new Texture(fileIOS3); 
     } 
     if(fileIOS4.exists()) { 
      imageSelected4 = new Texture(fileIOS4); 
     } 
     if(fileIOS5.exists()) { 
      imageSelected5 = new Texture(fileIOS5); 
     } 
     if(fileIOS6.exists()) { 
      imageSelected6 = new Texture(fileIOS6); 
     } 
     if(fileIOS7.exists()) { 
      imageSelected7 = new Texture(fileIOS7); 
     } 
     if(fileIOS8.exists()) { 
      imageSelected8 = new Texture(fileIOS8); 
     } 
     if(fileIOS9.exists()) { 
      imageSelected9 = new Texture(fileIOS9); 
     } 
     if(fileIOS10.exists()) { 
      imageSelected10 = new Texture(fileIOS10); 
     } 
     if(fileIOS11.exists()) { 
      imageSelected11 = new Texture(fileIOS11); 
     } 
     if(fileIOS12.exists()) { 
      imageSelected12 = new Texture(fileIOS12); 
     } 
    } 

    @Override 
    public void show() { 
    if(game.isIOS()){ 
     if(fileIOS1.exists()) { 
      selected1 = new TextureRegionDrawable(new TextureRegion(imageSelected1)); 
      style2.up = skin.newDrawable(skin.newDrawable(selected1)); 
      style2.down = skin.newDrawable(skin.newDrawable(selected1)); 
     } 

     if(!fileIOS1.exists()){ 
      style2.up = skin.newDrawable(skin.newDrawable(temp)); 
      style2.down = skin.newDrawable(skin.newDrawable(temp)); 
     } 
     if(fileIOS2.exists()) { 
      selected2 = new TextureRegionDrawable(new TextureRegion(imageSelected2)); 
      style3.up = skin.newDrawable(skin.newDrawable(selected2)); 
      style3.down = skin.newDrawable(skin.newDrawable(selected2)); 
     } 

     if(!fileIOS2.exists()){ 
      style3.up = skin.newDrawable(skin.newDrawable(temp)); 
      style3.down = skin.newDrawable(skin.newDrawable(temp)); 
     } 
     if(fileIOS3.exists()){ 
      selected3 = new TextureRegionDrawable(new TextureRegion(imageSelected3)); 
      style4.up = skin.newDrawable(skin.newDrawable(selected3)); 
      style4.down = skin.newDrawable(skin.newDrawable(selected3)); 
     } 
     if(!fileIOS3.exists()){ 
      style4.up = skin.newDrawable(skin.newDrawable(temp)); 
      style4.down = skin.newDrawable(skin.newDrawable(temp)); 
     } 
    Gdx.app.log("HERE:", "6"); 
     if(fileIOS4.exists()){ 
      selected4 = new TextureRegionDrawable(new TextureRegion(imageSelected4)); 
      style5.up = skin.newDrawable(skin.newDrawable(selected4)); 
      style5.down = skin.newDrawable(skin.newDrawable(selected4)); 
     } 
    Gdx.app.log("HERE:", "7"); 
     if(!fileIOS4.exists()){ 
      style5.up = skin.newDrawable(skin.newDrawable(temp)); 
      style5.down = skin.newDrawable(skin.newDrawable(temp)); 
     } 
     if(fileIOS5.exists()){ 
      selected5 = new TextureRegionDrawable(new TextureRegion(imageSelected5)); 
      style6.up = skin.newDrawable(skin.newDrawable(selected5)); 
      style6.down = skin.newDrawable(skin.newDrawable(selected5)); 
     } 
     if(!fileIOS5.exists()){ 
      style6.up = skin.newDrawable(skin.newDrawable(temp)); 
      style6.down = skin.newDrawable(skin.newDrawable(temp)); 
     } 
     if(fileIOS6.exists()){ 
      selected6 = new TextureRegionDrawable(new TextureRegion(imageSelected6)); 
      style7.up = skin.newDrawable(skin.newDrawable(selected6)); 
      style7.down = skin.newDrawable(skin.newDrawable(selected6)); 
     } 
     if(!fileIOS6.exists()){ 
      style7.up = skin.newDrawable(skin.newDrawable(temp)); 
      style7.down = skin.newDrawable(skin.newDrawable(temp)); 
     } 

    if(fileIOS7.exists()){ 
     selected7 = new TextureRegionDrawable(new TextureRegion(imageSelected7)); 
     style8.up = skin.newDrawable(skin.newDrawable(selected7)); 
     style8.down = skin.newDrawable(skin.newDrawable(selected7)); 
    } 
    if(!fileIOS7.exists()){ 
     style8.up = skin.newDrawable(skin.newDrawable(temp)); 
     style8.down = skin.newDrawable(skin.newDrawable(temp)); 
    } 
    if(fileIOS8.exists()){ 
     selected8 = new TextureRegionDrawable(new TextureRegion(imageSelected8)); 
     style9.up = skin.newDrawable(skin.newDrawable(selected8)); 
     style9.down = skin.newDrawable(skin.newDrawable(selected8)); 
    } 
    if(!fileIOS8.exists()){ 
     style9.up = skin.newDrawable(skin.newDrawable(temp)); 
     style9.down = skin.newDrawable(skin.newDrawable(temp)); 
    } 
    if(fileIOS9.exists()){ 
     selected9 = new TextureRegionDrawable(new TextureRegion(imageSelected9)); 
     style10.up = skin.newDrawable(skin.newDrawable(selected9)); 
     style10.down = skin.newDrawable(skin.newDrawable(selected9)); 
    } 
    if(!fileIOS9.exists()){ 
     style10.up = skin.newDrawable(skin.newDrawable(temp)); 
     style10.down = skin.newDrawable(skin.newDrawable(temp)); 
    } 
    if(fileIOS10.exists()){ 
     selected10 = new TextureRegionDrawable(new TextureRegion(imageSelected10)); 
     style11.up = skin.newDrawable(skin.newDrawable(selected10)); 
     style11.down = skin.newDrawable(skin.newDrawable(selected10)); 
    } 
    if(!fileIOS10.exists()){ 
     style11.up = skin.newDrawable(skin.newDrawable(temp)); 
     style11.down = skin.newDrawable(skin.newDrawable(temp)); 
    } 
    if(fileIOS11.exists()){ 
     selected11 = new TextureRegionDrawable(new TextureRegion(imageSelected11)); 
     style12.up = skin.newDrawable(skin.newDrawable(selected11)); 
     style12.down = skin.newDrawable(skin.newDrawable(selected11)); 
    } 
    if(!fileIOS11.exists()){ 
     style12.up = skin.newDrawable(skin.newDrawable(temp)); 
     style12.down = skin.newDrawable(skin.newDrawable(temp)); 
    } 
    if(fileIOS12.exists()){ 
     selected12 = new TextureRegionDrawable(new TextureRegion(imageSelected12)); 
     style13.up = skin.newDrawable(skin.newDrawable(selected12)); 
     style13.down = skin.newDrawable(skin.newDrawable(selected12)); 
    } 
    if(!fileIOS12.exists()){ 
     style13.up = skin.newDrawable(skin.newDrawable(temp)); 
     style13.down = skin.newDrawable(skin.newDrawable(temp)); 
    } 
}boxImage1.addListener(new ChangeListener() { 
      @Override 
      public void changed(ChangeEvent event, Actor actor) { 

        if(!fileIOS1.exists()) { 
         new Thread(new Runnable() { 
          @Override 
          public void run() { 
           gallery.iosPickImage1(); 
           Gdx.app.postRunnable(new Runnable() { 
            @Override 
            public void run() { 
             imageSelected1 = new Texture(fileIOS1); 

             selected1 = new TextureRegionDrawable(new TextureRegion(imageSelected1)); 

             style2.up = skin.newDrawable(skin.newDrawable(selected1)); 
             style2.down = skin.newDrawable(skin.newDrawable(selected1)); 
            } 
           }); 
          } 
         }).start(); 
        } 
        if(!fileIOS2.exists()) { 
         new Thread(new Runnable() { 
          @Override 
          public void run() { 
           gallery.iosPickImage2(); 
           Gdx.app.postRunnable(new Runnable() { 
            @Override 
            public void run() { 
             Gdx.app.log("CREATING IMAGE" , "1"); 
             imageSelected2 = new Texture(fileIOS2); 
             Gdx.app.log("CREATING IMAGE" , "2"); 
             selected2 = new TextureRegionDrawable(new TextureRegion(imageSelected2)); 
             Gdx.app.log("CREATING IMAGE" , "3"); 
             style3.up = skin.newDrawable(skin.newDrawable(selected2)); 
             style3.down = skin.newDrawable(skin.newDrawable(selected2)); 
            } 
           }); 
          } 
         }).start(); 
        } 

回答

1

首先解決您的錯字public GalleryScreen(MainClass gam**e**),二級你正在做的像12倍這是取決於圖像大小的內存消耗同樣的事情。想象一下,你加載12個12mb的圖像。當然這需要大量的內存,特別是如果你將它們解碼爲可繪製的。如果你只是加載它們,你已經消耗了144mb的RAM,這是很多!解碼他們可能會更大!

下面是一些提示,這將有助於

  1. 首先寫一個清潔方法,它加載的圖像進行尺寸調整 它的縮略圖顯示。使用最後的局部變量來放大圖像,在加載一些圖片並調整大小後,可以手動調用GC。儘量避免GC呼叫,但有時可能需要。看看:why-is-it-bad-practice-to-call-system-gc
  2. 清理你的代碼寫入方法。你正在檢查圖像是否存在 但你爲什麼要檢查它doulbe?如果它的加載已經存在,所以如果加載了它的 ,則不需要再次檢查它,因爲它在內存中作爲 對象。爲什麼不直接將它加載到TextureRegionDrawable中?
  3. 此外不要做12個相同類型的成員變量。使用a ArrayList並寫入動態代碼。否則,如果你改變圖片數量,你將不得不再次檢查整個 代碼。
  4. libgdx是非線程安全。在可運行的情況下產生可運行可能不是一個好的選擇。 libgdx中的runnable在下一幀之前開始。所以在這裏沒有什麼平行的東西,所以沒有必要產生一個線程來發佈一個可運行的。看看桌面後端應用程序:Dektop backend Frame method
  5. 不會在移動設備上產生線程如果您不需要。你把圖片加載到內存中,然後產生一個線程把它們放到盒子裏。如果它們被加載,這是沒有意義的。
+0

欣賞您的輸入! 1.什麼是「乾淨」的方法? GC =垃圾收集器?如何調用它? 2.將「文件」直接加載到TRD中? 3.這是我缺乏正規教育使我退縮的原因。我不是很喜歡Array,或者爲這種方式編寫動態代碼。 4/5。奧基。我只是從libgdx的維基上取得這個方法。它非常合適,因爲我想在一個線程中爲用戶選擇一個圖像打開畫廊,並在完成後爲postRunnable打開,然後將所選圖像寫入紋理。 – Benni

+0

要保持一種方法,所有你用一張圖片做的事情都很簡單,而不是維護你寫的所有代碼。 'System.gc()'不要忘記這是不好的做法,但在某些情況下它是需要的。 Es direkt進入TRD,例如:'selected1 = new TextureRegionDrawable(new TextureRegion(new Texture(fileIOS1)));'是的,libgdx使用它來爲下一幀發佈runnables,但它不是平行的。在Arraylist和動態方法你需要工作,因爲這是很好的閱讀和維護。儘量避免兩次寫同樣的東西。 – BennX

+0

所以一個方法應該仍然只是處理一個圖像?只是我在一個地方處理整個「把文件內容放在屏幕上」?如果我正確理解你的話? – Benni

相關問題