Android 后台服务消耗大量 RAM。如何解决这个问题?
Android Background service consuming lot of RAM. How to fix this?
我对 android 编码还很陌生。
我创建了一个应用程序,它会在一定时间后不断更改设备的墙纸。壁纸是从 SD 卡上的文件夹中挑选的。
我花了 2 个月的时间开发这个应用程序,因为我对 android/java 编码知之甚少。
无论如何,到目前为止,我可以毫无问题地构建 apk。该应用程序也可以正常工作。
但是,它会消耗设备上的大量内存。就像 >150MB 的 RAM!!这不好,android 也经常杀死应用程序。
我在下面发布代码。壁纸的改变是由下面的 code.An IntentService class.
完成的
如果有人能通过这段代码告诉我为什么它消耗了这么多资源,我将非常感激,还有,根据我的预期目的编写应用程序的可能解决方案是什么?
编辑 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;
}
}
});
}
}
请使用缩小版位图。它可以节省很多宝贵的记忆,这可能会解决您的问题。以下 android 开发者指南对其进行了详细说明。
http://developer.android.com/training/displaying-bitmaps/load-bitmap.html
尝试在设置新壁纸之前清除壁纸:
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(); (最小 API 14)
我对 android 编码还很陌生。
我创建了一个应用程序,它会在一定时间后不断更改设备的墙纸。壁纸是从 SD 卡上的文件夹中挑选的。
我花了 2 个月的时间开发这个应用程序,因为我对 android/java 编码知之甚少。
无论如何,到目前为止,我可以毫无问题地构建 apk。该应用程序也可以正常工作。
但是,它会消耗设备上的大量内存。就像 >150MB 的 RAM!!这不好,android 也经常杀死应用程序。
我在下面发布代码。壁纸的改变是由下面的 code.An IntentService class.
完成的如果有人能通过这段代码告诉我为什么它消耗了这么多资源,我将非常感激,还有,根据我的预期目的编写应用程序的可能解决方案是什么?
编辑 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;
}
}
});
}
}
请使用缩小版位图。它可以节省很多宝贵的记忆,这可能会解决您的问题。以下 android 开发者指南对其进行了详细说明。
http://developer.android.com/training/displaying-bitmaps/load-bitmap.html
尝试在设置新壁纸之前清除壁纸:
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(); (最小 API 14)