1

我正在使用片段兼容性包。

在我的 onAttach 片段中,我保留了一个Context参考。

public void onAttach(Activity activity) {
    super.onAttach(activity);
    Log.w(logTag, "Activity is: " + activity);
    mContext = activity;
    Log.w(logTag, "mContext is: " + mContext); // <-- Breakpoint here
}

稍后,我使用上下文

private String loadExampleSuccessXML () {
    try {
        AssetManager assets = this.mContext.getAssets(); // <-- Breakpoint here
        //Other Stuff

当我改变方向时, onAttach 似乎存储了新的 Context 但是当我到达时loadExampleSuccessXMLmContext为空。

mContext保存在 onAttach 和 at后我有断点mContext.getAsssets()

当我第一次运行应用程序时,调试器会显示 mContext 的值:

onAttach(), mContext [MyActivity] (id=830010419632)

loadExampleSuccessXML(), mContext [MyActivity] (id=830010419632)

但是在配置更改之后

onAttach(), mContext [MyActivity] (id=830010565472)

loadExampleSuccessXML(), mContext null

我不明白为什么。任何帮助都会很棒。

4

2 回答 2

1

根据我的经验,您应该处理方向更改:

<activity
    android:name="com..."
    android:configChanges="orientation|keyboardHidden" />

参考:

于 2012-07-13T09:47:34.593 回答
1

您能否提供更多详细信息来说明为什么需要维护对上下文的引用?至少这从来都不是我们的应用程序的要求,并且已被证明(尽管从您发布的代码中不是您的情况)是 Android 内存泄漏的罪魁祸首......

如果您需要维护先前活动状态的某个方面,那么我建议使用onSavedInstanceState(). 在这里,您可以传递一些简单的属性(例如我上次在列表中选择的项目的 id)。清单配置修复通常是错误的方法,尽管它在诸如此类的帮助网站上很普遍。你可能不想要那个。

最后,再次考虑使用setRetainInstance(true)...,根据我们的经验,如果使用不当,这是非常危险的方法!android.support.v4.*这可能只是我们,但至少在最近的库中确实存在一些错误。当设置为true这个时,确保片段永远不会被破坏(即被onDestroy()调用),而是简单地附加和分离,因为欠活动在旋转时被破坏并重新创建。它将对您的问题进行排序,但确实阅读了有关其用法的文档……一些副作用非常微妙。

于 2012-07-13T10:03:12.570 回答