MainActivity:
GeneralDialogFragment history_dialog = new GeneralDialogFragment();
public void showHistory(View view) {
Bundle bdl = new Bundle(1);
bdl.putString("dialog_type", "history");
history_dialog.setArguments(bdl);
history_dialog.show(getSupportFragmentManager(), null);
}
此代码存在于我的活动中。
现在,我在徘徊是否应该定义
GeneralDialogFragment history_dialog = new GeneralDialogFragment();
showHistory()函数内部或外部?
有什么区别?如果我把它放在外面,我是否会保留记忆(所以它只被实例化了一次?)
答案 0 :(得分:1)
你是否这样做主要取决于片段的作用。创建新Fragment对象的开销微乎其微,但可以根据您需要的数量加起来。如果DialogFragment
是静态的并且每秒弹出一次(为什么你会这样做?!?!),那么它可能值得保持它。如果每分钟弹出一个DialogFragment
,那么最终用户可能不会注意到您是否每次都重新创建该对象。
一般来说,Android(谷歌)建议采用延迟加载方法。因此,如果您在该方法的开头创建了对象并调用了show()
,那么您将失去对它的引用。在应用程序的FragmentManager
中仍会有对它的引用,因此它将保留在内存中。致电dismiss()
后,Fragment
将被删除,其占用的内存将被垃圾收集。这样做会产生轻微的CPU开销,但最大限度地减少内存使用量。
例外情况是,如果需要为片段分配大量资源。在那个的情况下,加载资源一次然后保留它们是明智的。例如,图像可以更好地缓存,因为它们可能需要很长时间才能解码。它们不必保存在Fragment本身中,但是大图像保留在内存中并在创建时传递给新的碎片会很好。
修改强>
只是旁注,如果您确定需要保留引用,最好检查一下以确保对话框尚未显示。如果您的对话框当前处于启用状态,则会再次致电showHistory()
,因为您在附加到setArguments()
的{{1}}上呼叫Fragment
,该应用目前会崩溃。
答案 1 :(得分:0)
这取决于您想要调用showHistoryMethod()的次数,还需要showHistory()方法之外的对象history_dialog。
因此,假设在showHistory()方法之外不需要该对象,并且它将仅在Activity期间调用一次,或者根本不调用,则将其放在showHistory()方法中。
如果将其放在外面,那么GeneralDialogFragment的实例将在主要Acitivity的生命周期内生效。然而,如果它在showHistory方法内部,那么GarabageCollector将释放内存,一旦不需要它。