以下解决方案主要建议这样做:
SharedPreferences
public class Activity1 {
private int var1;
public void setVar1(int val){
var1=val;
}
}
问题
定义设置变量的公共方法有什么问题:
public class Activity2 {
Activity1.setVar1(4);
}
并在Activity2中:
Activity2
它似乎适用于静态和非静态变量
EDIT1:
这是我当前项目的一个简单案例。在原始情况下,Activity1
连接到蓝牙集线器并接收多个传感器的数据。如果值已更改,则应将更改后的值(以及当然传感器ID')传递给负责更新UI的BroadcastReceiver
。传感器的数量可以超过100并且更新周期在100毫秒的范围内,这意味着可运行的每100毫秒读取收到的BT消息并检查变化。
EDIT2:
def self.search(query)
where("title like ?", "%#{query}%")
end
也是解决方案。但问题是:定义一个更改/更新变量的set方法是错误的。这种方法在内存方面效率低吗?它会使应用程序变慢吗?这是不合适的代码吗?
我只想知道如果我定义set方法来更改活动变量,我会遇到什么样的问题/效率低下。
答案 0 :(得分:2)
请记住,Activity
实例本身就是Context
,并且就它们占用的内存量而言,这些实例可能非常繁重,因为它们保留了对Activity的视图层次结构的引用,所有相关资源。保留对Activity实例的长期引用是内存泄漏的常见原因。
在这个特定的设置中牢记这一点:
public class Activity1 {
private int var1;
public void setVar1(int val){
var1=val;
}
}
...调用activity1.setVar1(...)
意味着正在运行的Activity2
实例具有对Activity1
实例的引用,这意味着系统不允许对其进行垃圾回收。这种模式可能最终导致应用程序耗尽其堆并崩溃。
您还询问了将这些方法暴露为静态方法的可能性。虽然你可以避免上述问题,但一个潜在的缺陷是,如果用户切换到另一个应用程序,并且系统内存不足,您的应用程序进程可能被系统杀死。由于静态变量与正在运行的流程实例相关联,当用户返回到您的应用程序并且系统恢复其状态时,var1
将重置为其默认值(零)。 (您可以通过挂钩生命周期方法将值保存到Bundle实例等来缓解这种情况。)
这些是我可以想到的一些原因,以避免将getter / setter写入Activity的界面。
答案 1 :(得分:1)
参考另一个活动并不是一个好方法,因为每个活动都有自己的生命周期。您引用的活动可能会被破坏,或者系统可能已经启动该活动的新实例,而您仍然引用旧活动。
或者,您可以使用事件总线(例如Otto)将对象/事件发布到另一个活动。