为什么我的活动在重新创建后似乎崩溃了,而不是在方向改变时?

时间:2014-09-14 15:00:18

标签: android android-activity android-fragments android-lifecycle

当我尝试创建一个片段(活动的单个孩子)时,我的第一个应用程序崩溃了。它是自定义' ListViewAdapter'上的NullPointerException,存储为成员变量。通过测试,我相信我正确地处理了我的片段的启动和停止,但我怀疑我没有处理onDestroy并且正确地分割娱乐,因为它发生在我将应用程序打开一段时间并且做了其他事情之后。

但是,我的应用处理方向更改which I thought included full recreation。所以,我的主要问题是:

  1. 如果方向更改重新创建活动,它是否也不会重新创建其子片段?
  2. 如果是这样,为什么在更改方向时我没有收到NullPointerException,因为我没有通过onSavedInstanceState执行我的适配器的任何自定义处理?
  3. 如何为测试目的引发导致崩溃的行为?
  4. 以下是崩溃的代码:

    // in my fragment's onCreateView()
           if (savedInstanceState != null) {
                myListViewAdapter.clear();  //this throws NullPointerException
            } else {
                courseId = ((Activity_Course) this.getActivity()).courseId;
            }
    

    在这种情况下,我可以跳过清除适配器,如果它是null,但我想更好地理解应该如何处理这些事情。谢谢!

2 个答案:

答案 0 :(得分:1)

  

我怀疑我没有正确处理onDestroy和片段娱乐,因为它发生在我将应用程序打开一段时间之后发生了其他事情

如果我不得不猜测,你的进程在后台终止了。您用于返回应用程序的路径(例如,最近任务列表)不涉及重新初始化此数据成员。

  

如果方向更改重新创建活动,它是否也不会重新创建其子片段?

除非保留片段(setRetainInstance(true)),否则它将重新创建片段。在这种情况下,现有片段将与旧活动分离并附加到新活动。

  

如果是这样,为什么我在更改方向时没有得到NullPointerException,因为我没有通过onSavedInstanceState对我的适配器执行任何自定义处理?

鉴于您目前提供的信息,我无法回答这个问题。

  

如何在出于测试目的时引发导致崩溃的行为?

如果我的猜测是正确的,并且这是因为您的流程已终止而导致的,您可以通过DDMS手动终止您的流程。

答案 1 :(得分:0)

我认为你还没有初步化你想要用于列表视图的arraylist或列表。也不要忘记setAdapter和NotifyDataSetChanged。