0

Я довольно новичок в кодировании Android.
Я создал приложение, которое будет непрерывно менять обои устройства через определенное время. Обои выбираются из папки на SD-карте. Мне понадобилось 2 месяца для разработки этого приложения, так как у меня очень мало идей по кодированию android/java. В любом случае, до сих пор я могу построить apk без проблем. Приложение также отлично работает. Однако он потребляет много памяти на устройстве. Как> 150 МБ ОЗУ !! что не очень хорошо, android также часто убивает приложение.Фоновая служба Android, потребляющая много оперативной памяти. Как это исправить?

Я размещаю код ниже. Смена обоев выполняется с помощью приведенного ниже кода. Класс IntentService.

Я был бы очень доволен, если кто-нибудь сможет пройти через этот код и рассказать мне, почему он потребляет столько ресурсов, а также, каково возможное разрешение для кода приложения с моей целью?

РЕДАКТИРОВАТЬ 1: Только что выяснилось, что потребление высокой памяти связано с тем, что мое приложение всегда работает в фоновом режиме. Можно ли убить приложение, когда оно устанавливает обои и снова запускает его после задержки?

public class ChangeWallpaper extends IntentService { 
    public static volatile boolean shouldContinue = true; 
    public File[] files_Chosen; 
    public ArrayList<String> File_String = new ArrayList<String>(); 
    public ArrayList<String> File_Array = new ArrayList<String>(); 


    public ChangeWallpaper() { 
     super(ChangeWallpaper.class.getName()); 
     //setIntentRedelivery(true); 
    } 

    @Override 
    protected void onHandleIntent(Intent myintent) { 
     dostuff(myintent); 
    } 


    private void dostuff(Intent myintent) { 
     int hours_delay = myintent.getIntExtra("hours_delay", 0); 
     int minutes_delay = myintent.getIntExtra("minutes_delay", 1); 
     String m_chosen = myintent.getStringExtra("m_chosen"); 

       File_Array = myinent.getStringArrayListExtra("File_String"); 
     WallpaperManager myWallpaper = WallpaperManager.getInstance(getApplicationContext()); 

//Caution: Infinite loop 
      while (true) { 
      if (!shouldContinue) { 
       stopSelf(); 
       return; 
      } 

      for (int i = 0; i < File_Array.size(); i++) { 
       Bitmap bitmap = BitmapFactory.decodeFile(File_Array.get(i)); 
       try { 
        myWallpaper.setBitmap(bitmap); 


       } catch (IOException e) { 
        e.printStackTrace(); 

       } 

       try { 
        TimeUnit.HOURS.sleep(hours_delay); 
        TimeUnit.MINUTES.sleep(minutes_delay); 

        repeatStuff(m_chosen); 


       } catch (InterruptedException e) { 
        e.printStackTrace(); 

       } 

      } 
      repeatStuff(m_chosen); 

     } 


    } 

    public void repeatStuff(String m_chosen) 
    { 
     final String m_chosen1 = m_chosen; 
     SimpleFileDialog FolderChooseDialog = new SimpleFileDialog(ChangeWallpaper.this, "FolderChoose", 
       new SimpleFileDialog.SimpleFileDialogListener() { 
        @Override 
        public void onChosenDir(String m_chosen1) { 


         File pathVar = new File(m_chosen1); 
         FilenameFilter imageFilter = new FilenameFilter() { 
          public boolean accept(File dir, String name) { 
           String lowercaseName = name.toLowerCase(); 
           if (lowercaseName.endsWith(".jpg") || lowercaseName.endsWith(".jpeg") 
             || lowercaseName.endsWith(".png") 
             || lowercaseName.endsWith(".gif")) { 
            return true; 
           } else { 
            return false; 
           } 
          } 
         }; 


         File[] files = pathVar.listFiles(imageFilter); 

         if (files.length > 1) { 


          files_Chosen = files; 

          for (int i = 0; i < files.length; i++) { 
           File_String.add(files[i].toString()); 
          } 

          File_Array = File_String; 

         } 

        } 
       }); 
    } 

} 
+1

У вашего кода много объектов File ... закрытие их после использования может быть полезно –

+0

Спасибо. @IchigoKurosaki ... Я хочу попробовать. Поиск не помог. Не могли бы вы рассказать мне, как закрыть File Objects? –

+0

Фактически у файла нет метода close. Проверьте этот stackoverflow.com/questions/4752266/why-java-io-file-doesnt-have-a-close-method .. вы можете установить их в null после их использования. ... по поводу возобновления фонового обслуживания через некоторое время .. вы можете использовать Timertask для перорального запуска служебного кода. –

ответ

0

Попробуйте очистить обои перед установкой нового:

private void doStuff(Intent myIntent){ 

... 

    for (int i = 0; i < File_Array.size(); i++) { 
      Bitmap bitmap = BitmapFactory.decodeFile(File_Array.get(i)); 
      try { 
       myWallpaper.clear(); 
       myWallpaper.setBitmap(bitmap); 


      } catch (IOException e) { 
       e.printStackTrace(); 

      } 

или попробуйте использовать метод myWallpaper.forgetLoadedWallpaper(); (Min API 14)

+0

Хороший ... Будет ли конечно попробуйте ... Спасибо @ A Honey Bustard –

+0

Он работает? –

+0

Да ... в некоторой степени ... Я думаю, что мое фоновое обслуживание создает много потоков в цикле ... следовательно, растет потребление ОЗУ.Спасибо @A Honey Bustard –

0

используйте масштабируемую версию растрового изображения. это сэкономит много драгоценной памяти, это может решить вашу проблему. Следующее руководство разработчика Android дает подробное описание об этом.

http://developer.android.com/training/displaying-bitmaps/load-bitmap.html

+0

Спасибо ... Попробует и вернется со статусом ... –

+0

Просто попробовал. Не помогает. Похоже, что потребление памяти связано с тем, что мое приложение всегда работает в фоновом режиме. Можно ли убить приложение, когда оно устанавливает обои и снова запускает его после задержки? –

+0

Я думаю, что это проблема утечки памяти, которую вы должны увидеть в использовании памяти кучи. https://developer.android.com/tools/debugging/debugging-memory.html – mcd