在Fragment构造函数中执行某些初始化代码是一种好习惯

时间:2015-01-27 14:01:42

标签: android

有时,我有一些无头片段,我需要在onCreate之前进行一些初始化

例如,

public class NetworkMonitorFragment extends Fragment {
    public static NetworkMonitorFragment newInstance() {
        return new NetworkMonitorFragment();
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setRetainInstance(true);
    }

    public void init() {
        // This function shall be call even before onCreate.
    }
}

NetworkMonitorFragment networkMonitorFragment = NetworkMonitorFragment.newInstance();
networkMonitorFragment.init();

我想知道,在Fragment构造函数中进行某些初始化是一种很好的做法吗?这样做有什么缺点吗?我问的原因是因为我没有看到很多代码示例。

public class NetworkMonitorFragment extends Fragment {
    public static NetworkMonitorFragment newInstance() {
        return new NetworkMonitorFragment();
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setRetainInstance(true);
    }

    public NetworkMonitorFragment() {
        init();
    }

    private void init() {
        // This function shall be call even before onCreate.
    }
}

NetworkMonitorFragment networkMonitorFragment = NetworkMonitorFragment.newInstance();

3 个答案:

答案 0 :(得分:1)

你当然可以,甚至其他方法,如Fragment.instantiate(Context context, String fname, Bundle args)调用newInstance()调用默认构造函数。虽然你必须知道一些事情:

  • 不应该任何与片段无关的东西 状态,生命周期或Android的上下文
  • 不应该任何占据16ms UI大部分内容的东西 绘图窗口
  • 不应该在那里产生新线程

因此,虽然变量实例化或基于外部上下文的一些快速计算,但是,例如,Date非常好,但是同步或异步解码甚至是小位图是一种快速解决问题的方法。

答案 1 :(得分:0)

如果此功能的执行和结果与片段生命周期无关并且不依赖于父活动那么,我猜,这只是一个偏好问题。

您可以通过描述此功能的作用来获得更具体的答案。

答案 2 :(得分:0)

如果您想在创建片段之前执行某些操作,请在 onAttach

中执行此操作

onAttach 始终在 onCreate look fragment lifecycle之前调用)

@Override
public void onAttach(Activity activity) {
    super.onAttach(activity);
    init();
    ...
}

如果您想确保创建视图,请以相同的方式在 onViewCreated 中执行此操作。