1

主要活动:

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

有什么不同?如果我把它放在外面,我会节省内存吗(所以它只实例化一次?)

4

2 回答 2

1

您是否这样做主要取决于 Fragment 的功能。创建一个新的 Fragment 对象的开销是微不足道的,但可以根据您需要创建的数量加起来。如果 aDialogFragment是静态的并且每秒都会弹出(你为什么要这样做?!?!),那么可能值得保留它。如果DialogFragment每分钟都会弹出一个,那么最终用户可能不会注意到您是否每次都在重新创建对象。

不过一般来说,Android (Google) 建议使用延迟加载方法。因此,如果您在该方法的开头创建对象并调用show(),您将丢失对它的引用。在应用程序中仍然会有对它的引用FragmentManager,所以它会留在内存中。一旦你调用dismiss()Fragment将被删除,它占用的内存将被垃圾回收。这样做会产生轻微的 CPU 开销,但可以最大限度地减少内存使用量。

如果需要为片段分配大量资源,则例外情况。在这种情况下,明智的做法是加载资源一次然后保留它们。例如,图像可以更好地缓存,因为它们可能需要很长时间才能解码。它们不必保存在 Fragment 本身中,但最好将大图像留在内存中并在创建新 Fragment 时传递给它们。

编辑: 只是一个旁注,如果您确实决定需要保留参考,最好检查一下以确保对话框尚未显示。showHistory()如果对话框当前已打开,如果您再次调用该应用程序当前将崩溃,因为您正在调用setArguments()附加FragmentActivity.

于 2013-02-20T17:26:43.527 回答
0

这取决于您要调用多少次 showHistoryMethod() 以及您是否需要 showHistory() 方法之外的对象 history_dialog。

因此,假设在 showHistory() 方法之外不需要该对象,并且它只会在 Activity 期间调用一次,或者根本不调用,然后将其放在 showHistory() 方法中。

如果你把它放在外面,那么 GeneralDialogFragment 的实例将在你的主要活动的生命周期内存在。而如果它在 showHistory 方法中,那么一旦不需要, GarabageCollector 就会释放内存。

于 2013-02-20T17:29:14.877 回答