我正在使用Fragment兼容包。
在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似乎存储新的上下文,但当我到达loadExampleSuccessXML
时,mContext
为空。
我在onAttach和mContext
保存mContext.getAsssets()
后有断点。
当我第一次运行应用程序时,调试器显示mContext的值:
在onAttach(), mContext [MyActivity] (id=830010419632)
在loadExampleSuccessXML(), mContext [MyActivity] (id=830010419632)
然后在配置更改后
在onAttach(), mContext [MyActivity] (id=830010565472)
在loadExampleSuccessXML(), mContext null
我无法理解为什么。任何帮助都会很棒。
答案 0 :(得分:1)
根据我的经验,你应该处理方向改变:
<activity
android:name="com..."
android:configChanges="orientation|keyboardHidden" />
参考文献:
答案 1 :(得分:1)
您是否可以提供一些更详细的信息,说明为什么需要维护对上下文的引用?这至少对我们的应用程序来说从来都不是必需的,并且已经显示(尽管不是在您发布的代码的情况下)是Android内存泄漏的主要罪魁祸首...
如果您需要维护上一个活动状态的某个方面,那么我建议您使用onSavedInstanceState()
。在这里,您可以传递一些简单的属性(例如我最后在列表中选择的项目的ID)。 Manifest配置修复通常是错误的方法,尽管它在诸如此类的帮助站点上很普遍。你可能不希望这样。
最后,再次考虑使用setRetainInstance(true)
......根据我们的经验,如果使用不当,这是非常危险的方法!这可能只是我们,但它至少对最近的android.support.v4.*
库有一些错误。当设置为true
时,这确保片段永远不会被销毁(即onDestroy()
被调用),但是简单地附加和分离,因为在循环中销毁了欠活动并重新创建。它会对你的问题进行排序,但确实阅读了有关它的用法的文档......一些副作用非常微妙。