在开发者控制台错误报告中,有时我会看到有NPE问题的报告。我不明白我的代码有什么问题。在模拟器上,我的设备应用程序在没有forcecloses的情况下运行良好,但是当调用getActivity()方法时,一些用户在片段类中获得NullPointerException。活动pulic class MyActivity extends FragmentActivity{
private ViewPager pager;
private TitlePageIndicator indicator;
private TabsAdapter adapter;
@Override
public void onCreate(Bundle savedInstanceState) {
pager = (ViewPager) findViewById(R.id.pager);
indicator = (TitlePageIndicator) findViewById(R.id.indicator);
adapter = new TabsAdapter(getSupportFragmentManager(), false);
adapter.addFragment(new FirstFragment());
adapter.addFragment(new SecondFragment());
indicator.notifyDataSetChanged();
adapter.notifyDataSetChanged();
// push first task
FirstTask firstTask = new FirstTask(MyActivity.this);
// set first fragment as listener
firstTask.setTaskListener((TaskListener) adapter.getItem(0));
firstTask.execute();
}
indicator.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {
@Override
public void onPageSelected(int position) {
Fragment currentFragment = adapter.getItem(position);
((Taskable) currentFragment).executeTask();
}
@Override
public void onPageScrolled(int i, float v, int i1) {}
@Override
public void onPageScrollStateChanged(int i) {}
});}AsyncTask类public class FirstTask extends AsyncTask{
private TaskListener taskListener;
...
@Override
protected void onPostExecute(T result) {
...
taskListener.onTaskComplete(result);
} }当应用程序从后台恢复时,可能会发生此错误。在这种情况下我应该如何妥善处理这种情况?
3 回答
![?](http://img1.sycdn.imooc.com/533e4d660001312002000200-100-100.jpg)
白衣染霜花
TA贡献1796条经验 获得超10个赞
好的,我知道这个问题实际上已经解决但我决定分享我的解决方案。我为我创建了抽象父类Fragment
:
public abstract class ABaseFragment extends Fragment{ protected IActivityEnabledListener aeListener; protected interface IActivityEnabledListener{ void onActivityEnabled(FragmentActivity activity); } protected void getAvailableActivity(IActivityEnabledListener listener){ if (getActivity() == null){ aeListener = listener; } else { listener.onActivityEnabled(getActivity()); } } @Override public void onAttach(Activity activity) { super.onAttach(activity); if (aeListener != null){ aeListener.onActivityEnabled((FragmentActivity) activity); aeListener = null; } } @Override public void onAttach(Context context) { super.onAttach(context); if (aeListener != null){ aeListener.onActivityEnabled((FragmentActivity) context); aeListener = null; } }}
正如你所看到的,我已经添加了一个监听器,所以每当我需要获取Fragments
Activity
而不是标准时getActivity()
,我需要调用
getAvailableActivity(new IActivityEnabledListener() { @Override public void onActivityEnabled(FragmentActivity activity) { // Do manipulations with your activity } });
![?](http://img1.sycdn.imooc.com/54584f3100019e9702200220-100-100.jpg)
繁花不似锦
TA贡献1851条经验 获得超4个赞
最好摆脱这种情况是在onAttach
调用时保持活动参考,并在需要的地方使用活动参考,例如
@Overridepublic void onAttach(Context context) { super.onAttach(context); mContext = context;}@Overridepublic void onDetach() { super.onDetach(); mContext = null;}
编辑,因为onAttach(Activity)
已折旧,现在onAttach(Context)
正在使用
- 3 回答
- 0 关注
- 732 浏览
添加回答
举报
0/150
提交
取消