【发布时间】:2020-05-19 13:00:50
【问题描述】:
我正在尝试使用 Fragment、ViewPager 和 TabLayout。
现在我在片段中启动服务命令时遇到问题。
我有我的服务:
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
....
}
我希望当我在 TabLayout 中更改选项卡时,所选片段会发出服务请求。
所以我试过这个:
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
Bundle extras = new Bundle();
Intent msgIntent = new Intent(getActivity(), myService.class);
msgIntent.setAction("INIT_REQUEST");
msgIntent.putExtra("id", sectionNumber);
msgIntent.putExtras(extras);
getActivity().startService(msgIntent);
}
但问题是在 getActivity() 中抛出一个异常,因为它为空:
原因:java.lang.NullPointerException:尝试调用虚拟 方法'java.lang.String android.content.Context.getPackageName()' 空对象引用
我哪里错了?
【问题讨论】:
-
viewPager 总是只加载当前之前的一个片段。因此,假设您有 3 个片段,而您是第一个片段。现在,当您转到第二个片段时,setUserVisibleHint 不会为空,因为该片段已经加载,但是当您从第一个片段转到第三个片段时,它将通过您的异常,因此您可以放心地打赌它启动片段的 onCreate 服务。
-
谢谢,所以如果我不明白你所说的,我会用一个简单的 if(getActivity() != null) 解决
-
通过使用 if(getActivity() != null) 你的应用程序不会崩溃,但你仍然会得到 null。因此,为避免您需要在片段的 onCreate 或 onAttach() 中运行服务。