避免android片段中内存泄漏的最佳方法是啥
Posted
技术标签:
【中文标题】避免android片段中内存泄漏的最佳方法是啥【英文标题】:What is the best way to avoid memory leaks in android fragment避免android片段中内存泄漏的最佳方法是什么 【发布时间】:2015-05-04 05:53:33 【问题描述】:我找到了很多方法来避免 android 片段中的内存泄漏,但哪种方法是最好的呢?
1.调用onDestroyView时设置视图为null
public class LeakyFragment extends Fragment
private View mLeak; // retained
@Override
public void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
setRetainInstance(true);
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
mLeak = inflater.inflate(R.layout.whatever, container, false);
return mLeak;
@Override
public void onDestroyView()
super.onDestroyView();
mLeak = null; // now cleaning up!
2.设置所有子view=null并移除view
@Override
public void onDestroyView()
super.onDestroyView();
unbindDrawables(mLeak);
private void unbindDrawables(View view)
if (view.getBackground() != null)
view.getBackground().setCallback(null);
if (view instanceof ViewGroup && !(view instanceof AdapterView))
for (int i = 0; i < ((ViewGroup) view).getChildCount(); i++)
unbindDrawables(((ViewGroup) view).getChildAt(i));
((ViewGroup) view).removeAllViews();
【问题讨论】:
参见参考文献。 ***.com/questions/13421945/… 【参考方案1】:将变量设置为null
并不意味着它会被GC'd。只有在任何地方都没有其他强引用时,它才会被 GC。
设置setRetainInstance(true)
本身不会使您的Fragment
泄漏,它只是在配置更改时保留Fragment
的该实例。它可能被认为是“有意识的泄漏”,因为您告诉框架您希望在当前 Activity
的生命周期之后保留 Fragment
对象。
现在Fragment
将泄露您的Activity
,如果它不是无 UI 的Fragment
。发生这种情况是因为具有 UI 的Fragments
将持有对 UI 组件的引用(即TextViews
、EditTexts
等),而这些Views
持有对Activity
的Context
的引用。为了避免这种情况,您需要将所有这些引用设置为null
。
此外,您可能还需要从其父级中删除 mLeak
。
【讨论】:
有什么样本可以避免内存泄漏吗?当我在 FragmentTabHost 中更改片段时,调用 setContentView 时内存不足。 您可能正在尝试加载需要太多内存的图像。您是否将可绘制对象设置为ImageView
?
不要使用 setRetainInstance。
你需要说出你可以用这个布局做什么。然后我们可以帮助您。
他为什么不能使用setRetainInsance()
@PedroPauloAmorim?以上是关于避免android片段中内存泄漏的最佳方法是啥的主要内容,如果未能解决你的问题,请参考以下文章
在用 Actionscript 和 MXML 编写的 Flex 程序中调试内存泄漏的最佳方法是啥?
托管 (.net) 应用程序中内存泄漏的最常见(并且经常被忽视)的原因是啥?