Android应用在重启时崩溃

日常应用

我忠实地遵循了以下指南:http : //developer.android.com/guide/topics/resources/runtime-changes.html我惊讶地发现使用RetainedFragment处理配置更改是如此容易。一切都在正常的事件流中正常运行。但是有一个小故障。如果我最小化该应用程序并在很长一段时间后启动它,它将崩溃并显示以下内容:

E/AndroidRuntime( 5734): FATAL EXCEPTION: main^M                                                                               E/AndroidRuntime( 5734): Process: net.citibuzz.app.scool, PID: 5734^M                                                
E/AndroidRuntime( 5734): java.lang.RuntimeException: Unable to start activity ComponentInfo{net.citibuzz.app.scool/net.citibuzz.app.scool.MapActivity}: android.support.v4.app.Fragment$InstantiationException: Unable to instantiate fragment net.citibuzz.app.scool.RetainedFragment: make sure class name exists, is public, and has an empty constructor that is public^M
E/AndroidRuntime( 5734):        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2209)^M      
E/AndroidRuntime( 5734):        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2269)^M       
E/AndroidRuntime( 5734):        at android.app.ActivityThread.access$800(ActivityThread.java:139)^M                  
E/AndroidRuntime( 5734):        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1210)^M            
E/AndroidRuntime( 5734):        at android.os.Handler.dispatchMessage(Handler.java:102)^M                            
E/AndroidRuntime( 5734):        at android.os.Looper.loop(Looper.java:136)^M                                         
E/AndroidRuntime( 5734):        at android.app.ActivityThread.main(ActivityThread.java:5102)^M                       
E/AndroidRuntime( 5734):        at java.lang.reflect.Method.invokeNative(Native Method)^M                            
E/AndroidRuntime( 5734):        at java.lang.reflect.Method.invoke(Method.java:515)^M                                
E/AndroidRuntime( 5734):        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785)^M         
E/AndroidRuntime( 5734):        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601)^M                    
E/AndroidRuntime( 5734):        at dalvik.system.NativeStart.main(Native Method)^M                                       
E/AndroidRuntime( 5734): Caused by: android.support.v4.app.Fragment$InstantiationException: Unable to instantiate fragment net.citibuzz.app.scool.RetainedFragment: make sure class name exists, is public, and has an empty constructor that is public^M
E/AndroidRuntime( 5734):        at android.support.v4.app.Fragment.instantiate(Fragment.java:413)^M                  
E/AndroidRuntime( 5734):        at android.support.v4.app.FragmentState.instantiate(Fragment.java:97)^M               
E/AndroidRuntime( 5734):        at android.support.v4.app.FragmentManagerImpl.restoreAllState(FragmentManager.java:1790)^M
E/AndroidRuntime( 5734):        at android.support.v4.app.FragmentActivity.onCreate(FragmentActivity.java:213)^M     
E/AndroidRuntime( 5734):        at android.support.v7.app.ActionBarActivity.onCreate(ActionBarActivity.java:97)^M    
E/AndroidRuntime( 5734):        at net.citibuzz.app.scool.MapActivity.onCreate(MapActivity.java:134)^M               
E/AndroidRuntime( 5734):        at android.app.Activity.performCreate(Activity.java:5248)^M                          
E/AndroidRuntime( 5734):        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1110)^M     
E/AndroidRuntime( 5734):        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2173)^M      
E/AndroidRuntime( 5734):        ... 11 more^M                                                                            
E/AndroidRuntime( 5734): Caused by: java.lang.InstantiationException: can't instantiate class net.citibuzz.app.scool.RetainedFragment; no empty constructor^M 
E/AndroidRuntime( 5734):        at java.lang.Class.newInstanceImpl(Native Method)^M                                  
E/AndroidRuntime( 5734):        at java.lang.Class.newInstance(Class.java:1208)^M                                    
E/AndroidRuntime( 5734):        at android.support.v4.app.Fragment.instantiate(Fragment.java:402)^M                  
E/AndroidRuntime( 5734):        ... 19 more^M     

显然,系统资源不足,杀死了活动实例,然后尝试在重新启动时重新创建它。这让我有些困惑。看来系统处理两种情况的方式有所不同:一种是由于配置更改而破坏活动,另一种是由于资源紧缩而破坏活动。我认为这一定是一个普遍的问题。我该如何处理?

如果需要,我很乐意提供代码段,但是正如我在一开始所说的那样,我一直遵循Google的示例代码到T。

编辑:好的,我知道我确实做了一些自己的更改。我添加了一个构造函数:-(

public class RetainedFragment extends Fragment {

    // data object we want to retain
    private MapState data;
    private Context mContext;

    public RetainedFragment(Context context) {
        mContext = context;
    }

    // this method is only called once for this fragment
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // retain this fragment
        setRetainInstance(true);
    }

    public void setData(MapState data) {
        this.data = data;
    }

    public MapState getData() {
        return data;
    }

    @Override
    public void onDestroy() {
        super.onDestroy();

    }

    ...
}
Rod_Algonquin
Caused by: java.lang.InstantiationException: can't instantiate class net.citibuzz.app.scool.RetainedFragment;

您不能在片段中有一个需要调用其空构造函数的自定义构造函数,如果未定义,则将出现该异常

这是关于它文档

Fragment的所有子类都必须包含一个公共的空构造函数。
框架通常会在需要时重新实例化片段类,尤其是在状态还原期间,并且需要能够找到此构造函数以实例化它。如果空的构造函数不可用,则在状态还原期间某些情况下会发生运行时异常。

顺便说一下,您可以通过调用getActivity();活动的上下文来调用片段中对上下文的引用

如果要实例化片段,则需要创建一个静态方法,该方法将返回新创建的片段的引用

public static RetainedFragment newInstance(int index) {
    RetainedFragment f = new RetainedFragment();

    // Supply index input as an argument.
    Bundle args = new Bundle();
    args.putInt("index", index);
    f.setArguments(args);

    return f;
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章