Android 片段getActivity()--避免NPE

Android 片段getActivity()--避免NPE,android,android-fragments,nullpointerexception,Android,Android Fragments,Nullpointerexception,我有一个单一的活动应用程序,其中包含许多片段(15个左右)。myMyActivity中的某些方法是所有片段所必需的,例如显示对话框。因此,我在一个片段(它们都扩展了MyFragment)的示例调用中得到的结果如下: getMyActivity().displayDialog(msg) 而getMyActivity定义为MyFragment: MyActivity getMyActivity() { return (MyActivity) getActivity(); } 但是,有时getA

我有一个单一的活动应用程序,其中包含许多片段(15个左右)。my
MyActivity
中的某些方法是所有片段所必需的,例如显示
对话框
。因此,我在一个片段(它们都扩展了
MyFragment
)的示例调用中得到的结果如下:

getMyActivity().displayDialog(msg)

getMyActivity
定义为
MyFragment

MyActivity getMyActivity() {
  return (MyActivity) getActivity();
}
但是,有时getActivity()为null,因此在这种情况下我得到NPE。所以我要做的是将这些方法移动到MyFragment中,以便:

protected void displayDialog(String msg) {
  if (getMyActivity() != null) {
     getMyActivity().displayDialog(msg);
  } else {
     // what do I do here?
  }
}
对于我需要从MyActivity中引用的10种左右的方法,这种方法有意义吗(这样做是否存在任何陷阱)?另外,如果
getActivity()
为空,我将如何提供反馈


编辑:NullPointerException原因的一个常见示例类似于由片段发送的网络调用,在所述网络调用完成时,当
活动
同时被销毁时,试图显示一个对话框

例如,最好使用一些ParentFragment

public abstract class ParentFragment extends Fragment {

public Activity activity;

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

}
那你必须把你所有的碎片

public class SomeFragment extends ParentFragment {}
并将这些活动用于

activity.displayDialog(msg);

如果getActivity()的返回值==null,则片段不会附加到父活动的FragmentManager中

一个常见的错误是将这些片段的引用作为对象变量保存在父活动中。这会导致碎片产生NPE

我建议你检查一下这是否是你的情况。 若否,则:

  • 查看您是否正确地从FragmentManager中删除了片段
  • 查看是否以正确的方式将片段添加到Framgnetmanager
  • 如果是,请删除对象变量并通过FragmentManager添加片段,请参阅:


    希望这有助于

    工作。如果启动某个线程并将其休眠几秒钟,则该线程将为空;如果有人退出应用程序,它将是空的。这基本上就是你应该做的。我认为更好的方法是使用回调接口。是的。正在检查
    getActivity()!=空值
    是正常值。当片段被分离时,Activity通常为null(这通常发生在Activity被销毁或您已手动从Activity中删除片段时)。您希望提供什么样的反馈?在哪里?如果活动被破坏,您想展示什么?您可能应该在某个地方敬酒,但我不知道在哪里合适。调用
    getMyActivity
    时,片段是否仍然附加到
    Activity