使用getLastNonConfigurationInstance恢复活动状态会生成未经检查的强制转换警告

时间:2011-02-23 15:50:24

标签: android casting android-activity hashmap

在我的活动中,我想使用'onRetainNonConfigurationInstance'方法来存储我在活动中加载的一些数据(没有视图)。这可以加快加载速度并在方向改变时保持一致状态。

由于return参数是一个Object,我想返回两个项目,我想出了以下解决方案:

@Override
public Object onRetainNonConfigurationInstance() {

    HashMap< String, Object> data = new HashMap<String, Object>();

    data.put( "mAdapter", getExpandableListAdapter() );
    data.put( "folderList", folderList );

    return data;

}

当我使用以下方法收集onCreate方法中的数据时:

HashMap<String, Object> savedData = ( HashMap< String, Object> ) getLastNonConfigurationInstance();

我从编译器得到一个未经检查的强制警告。我假设这是因为编译器无法确定具有指定类型的HashMap是否实际上将在getLastNonConfigurationInstance的Object返回中。然后我将HashMap中的Objects转换为正确的数据类型。我的问题是:

当我知道数据将以HashMap的形式返回时(因为我将其存储在那里),这是一种将多个数据传递回onCreate的安全方法吗?

我想我可以使用@SuppressWarnings(“未选中”)来抑制警告,但我想确保我的代码有效。

亲切的问候, IVO

1 个答案:

答案 0 :(得分:2)

在编译时知道完整的内容集时,为什么要使用hashmap而不是简单的类似struct的类?

另外,请注意在此类活动实例之间传递任何包含Context / Activity引用的内容。有可能你传递的适配器拥有一个Context引用,这样它就可以获得一个LayoutInflater来扩展项目视图。这将产生两个负面影响:

  • 活动可能很大,并且挂起对已被销毁的活动的引用将使垃圾收集器无法收集它。 (这是人们在谈论泄漏环境或活动时所说的那种事。)
  • 上下文带有屏幕方向和主题等配置信息。如果在配置更改后重复使用旧上下文来扩展布局,则最终会使用错误的配置数据。如果您使用资源系统为纵向和横向模式提供不同的布局,例如,这将无法正常工作。

这就是该方法被称为“非配置实例”的原因。返回不受配置影响的对象是正确的。在类似于包含上下文的适配器的情况下,传递适配器访问的数据而不是适配器本身,并在新的活动实例中创建新的适配器。