0

我有一个带有私有静态字段的活动。当我转动屏幕时,该静态字段设置为空。当然,有人会猜测 Android 会终止该进程,但我敢肯定它不会。但是,让我们从头开始。

有一个 JNI 库,其函数只能从一个线程调用。在 Java 中,库函数作为对象的本地方法可见(顺便说一下,该对象只有一个实例是有意义的,只有一个库实例具有其静态结构)。库对象通过包装器使用,这是一个提供读/写访问锁的 Java 层。该活动具有引用该包装库对象的私有静态字段。该库在单独的线程上执行长操作。

单例创建如下。由于所有活动都是在同一个 UI 线程上创建的,因此在 onCreate() 中,我只是检查了该字段是否为空,如果为空,则创建一个包装的库对象。没有问题——至少在 Android 2.x 上是这样。

现在,在 Android 4 上,会发生以下情况:我开始长时间操作并转动屏幕。重新创建活动,onCreate() 中的 savedInstanceState 参数不为空,但该私有静态字段空。现在,创建了一个新的库对象,然后使用其新的读/写锁创建了一个新的包装器,然后调用了一个库操作......当然,库仍然忙于转动屏幕之前发起的请求,新的读/写锁不能保护旧库,数据会损坏,一切都会崩溃。

我听说对此的补救措施是将引用保持为不是静态字段,而是作为应用程序的实例字段。

现在,问题是:

为什么? 这到底是怎么回事? 我必须重写所有单例吗?

4

0 回答 0