【发布时间】:2012-07-22 19:16:29
【问题描述】:
在开发者控制台错误报告中,有时我会看到带有 NPE 问题的报告。我不明白我的代码有什么问题。在模拟器上,我的设备应用程序在没有强制关闭的情况下运行良好,但是当调用 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);
}
}
片段类
public class FirstFragment extends Fragment immplements Taskable, TaskListener{
public FirstFragment() {
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
return inflater.inflate(R.layout.first_view, container, false);
}
@Override
public void executeTask() {
FirstTask firstTask = new FirstTask(MyActivity.this);
firstTask.setTaskListener(this);
firstTask.execute();
}
@Override
public void onTaskComplete(T result) {
// NPE is here
Resources res = getActivity().getResources();
...
}
}
当应用程序从后台恢复时,可能会发生此错误。在这种情况下我应该如何正确处理这种情况?
【问题讨论】:
-
我发现了一个问题,但不是解决方案。我不知道为什么,但片段恢复了早期的活动。这只发生在我的应用程序在最近应用程序列表中的最后位置时,系统似乎破坏了我的应用程序。
-
当我从后台 Fragmetn onCreate 恢复我的应用程序时,在活动 onCreate/onResume 方法之前调用了一个 onResume。似乎一些分离的片段还活着并试图恢复。
-
在这个字符串中 firstTask.setTaskListener((TaskListener) adapter.getItem(0)); adapter.getItem(0) 返回旧片段,适配器不正确删除片段
-
顺便说一句很棒的活动 :) 提出问题,留下 cmets 并给出答案 - 全部由一个人完成!为这些 +1。
-
将 Context(getActivity()) 保存在 onCreateView() 中,因为在后台情况下重新创建视图时会调用此方法。
标签: android android-fragments android-activity android-asynctask nullpointerexception