Я довольно новичок в кодировании 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;
}
}
});
}
}
У вашего кода много объектов File ... закрытие их после использования может быть полезно –
Спасибо. @IchigoKurosaki ... Я хочу попробовать. Поиск не помог. Не могли бы вы рассказать мне, как закрыть File Objects? –
Фактически у файла нет метода close. Проверьте этот stackoverflow.com/questions/4752266/why-java-io-file-doesnt-have-a-close-method .. вы можете установить их в null после их использования. ... по поводу возобновления фонового обслуживания через некоторое время .. вы можете использовать Timertask для перорального запуска служебного кода. –