2014-05-09 23 views
1

我有一个片段,它调用setRetainInstance(true),这样它就不会在方向更改时重新创建。它确实有而不是有一个公共的空构造函数。我的印象是,该框架将永远不会(重新)创建具有setRetainInstance(true)应用了片段下,但是,我已经收到异常,指出正在创建它:由Android框架构建的保留片段(没有空的构造函数)

java.lang.RuntimeException: Unable to start activity ComponentInfo{<foo>/<foo>.Activity}: android.app.Fragment$InstantiationException: Unable to instantiate fragment <foo>.SomeFragment: make sure class name exists, is public, and has an empty constructor that is public 
     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2063) 
     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2088) 
     at android.app.ActivityThread.access$600(ActivityThread.java:134) 
     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1199) 
     at android.os.Handler.dispatchMessage(Handler.java:99) 
     at android.os.Looper.loop(Looper.java:137) 
     at android.app.ActivityThread.main(ActivityThread.java:4744) 
     at java.lang.reflect.Method.invokeNative(Method.java) 
     at java.lang.reflect.Method.invoke(Method.java:511) 
     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786) 
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) 
     at dalvik.system.NativeStart.main(NativeStart.java) 
Caused by: android.app.Fragment$InstantiationException: Unable to instantiate fragment <foo>.SomeFragment.d: make sure class name exists, is public, and has an empty constructor that is public 
     at android.app.Fragment.instantiate(Fragment.java:588) 
     at android.app.FragmentState.instantiate(Fragment.java:97) 
     at android.app.FragmentManagerImpl.restoreAllState(FragmentManager.java:1732) 
     at android.app.Activity.onCreate(Activity.java:883) 
     at <foo>.Activity.onCreate(SourceFile:57) 
     at android.app.Activity.performCreate(Activity.java:5008) 
     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1079) 
     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2027) 
     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2088) 
     at android.app.ActivityThread.access$600(ActivityThread.java:134) 
     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1199) 
     at android.os.Handler.dispatchMessage(Handler.java:99) 
     at android.os.Looper.loop(Looper.java:137) 
     at android.app.ActivityThread.main(ActivityThread.java:4744) 
     at java.lang.reflect.Method.invokeNative(Method.java) 
     at java.lang.reflect.Method.invoke(Method.java:511) 
     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786) 
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) 
     at dalvik.system.NativeStart.main(NativeStart.java) 
Caused by: java.lang.InstantiationException: cannot instantiate class <foo>.SomeFragment; no empty constructor 
     at java.lang.Class.newInstanceImpl(Class.java) 
     at java.lang.Class.newInstance(Class.java:1319) 
     at android.app.Fragment.instantiate(Fragment.java:577) 
     at android.app.FragmentState.instantiate(Fragment.java:97) 
     at android.app.FragmentManagerImpl.restoreAllState(FragmentManager.java:1732) 
     at android.app.Activity.onCreate(Activity.java:883) 
     at <foo>.Activity.onCreate(SourceFile:57) 
     at android.app.Activity.performCreate(Activity.java:5008) 
     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1079) 
     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2027) 
     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2088) 
     at android.app.ActivityThread.access$600(ActivityThread.java:134) 
     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1199) 
     at android.os.Handler.dispatchMessage(Handler.java:99) 
     at android.os.Looper.loop(Looper.java:137) 
     at android.app.ActivityThread.main(ActivityThread.java:4744) 
     at java.lang.reflect.Method.invokeNative(Method.java) 
     at java.lang.reflect.Method.invoke(Method.java:511) 
     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786) 
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) 
     at dalvik.system.NativeStart.main(NativeStart.java) 

我的问题是双重的:

  1. Android框架在哪些情况下创建这些片段?我有一个预感,当一个活动关闭,垃圾收集和后来打开。
  2. 我是否会修正这个bug,如上面的例外报告所示,通过使用bundle将参数传递给fragment? (如图an answer to "Do fragments really need an empty constructor?"

回答

0

在哪些情况下做Android框架创建这些片段?我有一个预感,当一个活动关闭,垃圾收集和后来打开。

关闭。如果Android终止你的流程(例如,用户按下HOME,并且时间流逝),那么这种情况就会发生,然后用户试图以一种将用户带回到先前的活动实例的方式返回到你的应用程序(例如,最近的任务列表)。

我是否会修正错误,如上面的异常报告所示,通过使用捆绑包将参数传递给碎片?

也许。 Bundle将保存实例状态的一部分,因此即使在这种情况下,您也可以使用保存的数据访问Bundle。我说“可能”只是因为你没有指明你传入片段构造函数的内容,并且Bundle不能容纳任意对象。某些对象(例如Socket)不能以这种方式保存。

+0

我使用开发人员选项'不要保留活动'在我的手机上以达到错误状态。打开它,然后让片段显示并离开活动。活动被破坏。现在使用最近的任务列表重新输入,然后应用程序应该崩溃。 – foens