Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/214.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 我的处理程序对象应该是静态的吗?_Android_Handler - Fatal编程技术网

Android 我的处理程序对象应该是静态的吗?

Android 我的处理程序对象应该是静态的吗?,android,handler,Android,Handler,我知道如果我在Android中对处理程序类进行子分类,最好是静态的,否则可能会发生内存泄漏。像这样: static class MyHandler extends Handler {...} Handler mHandler = new Handler(); static Handler mHandler = new Handler(); 但如果我只是构造一个类处理程序的对象呢?像这样: static class MyHandler extends Handler {...} Handl

我知道如果我在Android中对处理程序类进行子分类,最好是静态的,否则可能会发生内存泄漏。像这样:

static class MyHandler extends Handler {...}
Handler mHandler = new Handler();
static Handler mHandler = new Handler();
但如果我只是构造一个类处理程序的对象呢?像这样:

static class MyHandler extends Handler {...}
Handler mHandler = new Handler();
static Handler mHandler = new Handler();
它应该是静态的吗?像这样:

static class MyHandler extends Handler {...}
Handler mHandler = new Handler();
static Handler mHandler = new Handler();
因为默认处理程序将使用默认(主)线程,并且一个进程中只有一个主线程。 这是否意味着mHandler不应该是我的组件类中的非静态字段(即Activity、Receiver等)? 谢谢

------------------更新更多信息--------------------- 谢谢你的快速回复。 但以下所有答案都不是我要问的

问题是,, 默认情况下,处理程序对象将自身“附加”到进程。 (从技术上讲,它连接到主螺纹)

这意味着它的生命周期不与活动或接收器相关联

所以,如果我把它设为活动的非静态字段, 不是吗


(我的问题更多的是“理论/逻辑”,而不是“实践”)

静态类无论如何都不能调用自身的实例,所以不。这实际上是静态类的定义。您真正想知道的是如何清理非静态对象,这非常简单

Java虚拟机有一个垃圾处理阶段,定期检查对活动对象的引用。如果一个活动对象没有引用,JVM会将其清理到垃圾箱中

例如,如果您的处理程序位于代码块中,如while循环或函数或其他任何内容中

{
   Handler testHandler = new Handler();
}
当该块结束时,无法再访问testHandler。它没有引用它,垃圾处理将处理它。所以我不会太担心它,除了在一个无限循环中,每个循环都能够在循环外的arrayList中生成一个新的处理程序(),因为这样处理程序就永远不会死,最终你会使用所有内存并崩溃

但这些都是必要的人为测试用例。它们并不经常发生,但我想如果你问的是内存和安卓系统,你可能正在制作一个游戏,而游戏有无限循环,所以这是你需要注意的


只需将对象设置为null,即可删除对象。null是一个特殊的对象,根本没有实际的引用,因此将变量设置为null的内存不足。不幸的是,除非它在某个时候超出范围,否则会有一点内存用于存储变量的名称。但是在java中,没有其他(好的)方法可以摆脱它。

pskink在上面的评论中指出了以下(优秀的)文章:

这对于Android开发人员(实际上对任何Java开发人员也是如此!)来说都是很有价值的信息:一个非静态的内部类包含对外部类(活动)的(隐式)引用。因此,在内部类的寿命比外部类长的情况下,在内部类被删除之前,外部类将没有资格进行垃圾收集。或者换句话说,这可能导致内存泄漏

例如,在Android中,配置更改可能会导致活动对象被销毁,并创建一个新对象。在这种情况下,如果处理程序(定义为内部非静态类)仍在运行,则GC将无法清理活动对象

以上所有内容与如何声明包含处理程序的变量无关。该变量可以是静态的或非静态的: 关键字
static
在不同的上下文中有不同的含义-因此,当我们引用一个类变量时,将其设置为
static
意味着它被该类的所有对象共享(不同于非静态变量-创建和访问:每个对象一个)


回到上一个示例:将保持处理程序的变量设置为静态意味着只为Activity类创建一个这样的对象,因此即使配置更改生效,Activity对象被销毁并创建了一个新对象,新对象也将继续使用相同的(静态)处理程序。

如果它是一个实例对象,您对它有问题吗?请参阅和以及其他许多google叔叔的answers@Elltz是的,他们是不同的。如果mHandler不是静态的,那么如果包含类(例如活动)被销毁,它可能会被销毁。但是如果mHandler是静态的,它将不会被破坏,直到进程被终止。由于上述差异,他们可以/应该处理不同的任务。