我正在使用Fragment兼容性软件包。

在onAttach的Fragment中,我保留了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,但是当我进入loadExampleSuccessXML时,mContext为null。

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

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

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

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

但是然后在配置更改后

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

loadExampleSuccessXML(), mContext null

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

最佳答案

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

如果您需要保持先前活动状态的某个方面,那么我建议使用onSavedInstanceState()。在这里,您可以通过一些简单的属性(例如,我上次在列表中选择的项的ID)。清单配置修复通常是错误的方法,尽管它在这样的帮助站点上很普遍。您可能不想要那样。

最后,再次尝试使用setRetainInstance(true) ...,根据我们的经验,如果使用不当,这将是非常危险的方法!那可能只是我们,但是至少在最近的android.support.v4.*库中确实存在一些错误。设置为true时,这可确保该片段永不销毁(即调用onDestroy()),但由于旋转时销毁了所欠活动并重新创建了该片段,因此可以简单地对其进行附着和分离。它将解决您的问题,但是请仔细阅读有关其用法的文档...某些副作用非常微妙。

关于android - 方向变化的背景和 fragment ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11467796/

10-09 09:51