我有一个私有静态字段的活动。当我转动屏幕时,静态字段设置为null。当然,人们会猜测Android会杀死这个过程,但我确信它没有。但是,让我们从头开始。
有一个JNI库,其功能只能从一个线程调用。从Java开始,库函数作为对象的本机方法可见(顺便说一下,该对象只有一个实例是有意义的,只有一个具有静态结构的库实例)。库对象通过包装器使用,包装器是提供读/写访问锁的Java层。该活动有一个私有静态字段,引用该包装库对象。该库在单独的线程上执行长操作。
单身人士的创作如下。由于所有活动都是在同一个UI线程上创建的,因此在onCreate()中我只检查该字段是否为null,如果为null,则创建一个包装的库对象。没问题 - 至少在Android 2.x上。
现在,在Android 4上,会发生以下情况:我开始长时间操作并转动屏幕。 重新创建活动,onCreate()中的savedInstanceState参数不为null,但私有静态字段为 null。 现在,创建一个新的库对象,然后使用新的读/写锁创建一个新的包装器,然后调用库操作...当然,库在转动屏幕之前仍然忙于启动请求,新的读/写锁不保护旧库,数据损坏,一切都崩溃。
我听说过对此的补救措施是将引用保留为静态字段,而不是应用程序的实例字段。
现在,问题是:
为什么? 到底发生了什么? 我是否必须重写所有单身人士?