Java 当主屏幕小部件运行时,数据对象的静态数组列表是否会导致内存泄漏
在下面的代码中,我有一个包含一组变量的类。我创建了该类的几个实例,并将它们保存到arraylist中。arraylist是同一类的一部分,但标记为静态。 同一个应用程序有一个主屏幕应用程序小部件。 我担心静态arraylist将永远留在内存中,直到用户删除应用程序小部件。这是真的吗? 静态arraylist是一个好主意还是一个替代方案Java 当主屏幕小部件运行时,数据对象的静态数组列表是否会导致内存泄漏,java,android,arraylist,static,android-widget,Java,Android,Arraylist,Static,Android Widget,在下面的代码中,我有一个包含一组变量的类。我创建了该类的几个实例,并将它们保存到arraylist中。arraylist是同一类的一部分,但标记为静态。 同一个应用程序有一个主屏幕应用程序小部件。 我担心静态arraylist将永远留在内存中,直到用户删除应用程序小部件。这是真的吗? 静态arraylist是一个好主意还是一个替代方案 public class Data { public static ArrayList<Data> listData = new ArrayL
public class Data {
public static ArrayList<Data> listData = new ArrayList<Data>();
String string;
int integer;
Data(String string, int integer){
this.string = string;
this.integer = integer;
}
}
public class DataChanger {
DataChanger(){
Data.listData.add(new Data("string", 1));
}
}
公共类数据{
公共静态ArrayList listData=new ArrayList();
字符串字符串;
整数;
数据(字符串、整数){
this.string=string;
this.integer=整数;
}
}
公共类数据转换器{
数据转换器(){
Data.listData.add(新数据(“字符串”,1));
}
}
静态arraylist将永远留在内存中,直到用户删除应用程序小部件
这不太可能发生,因为AppWidgetProvider是Android小部件的一个方便的BroadcastReceiver
类。如果应用程序的其他部分没有运行,则进程可能会在调用onUpdate()
之间终止
BroadcastReceiver
的官方文件非常清楚地表明
BroadcastReceiver
对象仅在调用onReceive(上下文、意图)
期间有效。一旦代码从此函数返回,系统将认为对象已完成且不再处于活动状态
这对您在onReceive(Context,Intent)
实现中可以执行的操作有重要影响:任何需要异步操作的操作都不可用,因为您需要从函数返回来处理异步操作,但此时,BroadcastReceiver
不再处于活动状态,因此系统可以在异步操作完成之前终止其进程
特别是,您可能无法在广播接收器
中显示对话框或绑定到服务。对于前者,您应该改用NotificationManager
API。对于后者,可以使用Context.startService()
向服务发送命令
参考文献-