Android类设计 - 每次我想展示它时,我应该在活动中重新实例化对话框类吗?

时间:2013-02-20 17:15:17

标签: android class-design

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()函数内部或外部?

有什么区别?如果我把它放在外面,我是否会保留记忆(所以它只被实例化了一次?)

2 个答案:

答案 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将释放内存,一旦不需要它。