Android实际开发中的bug总结与解决方法(一)

 
Android开发中有很多bug,我们是完全可以在线下避免的,不要等到线上报的BUG的再去修复。下面是我在实际开发中遇到过的bug和解决方法。
BUG 1: 
java.lang.RuntimeException: Unable to start activity ComponentInfo  {com.netease.caipiao.ssq/com.netease.caipiao.ssq.ExpertListActivity}: 
 android.support.v4.app.Fragment$InstantiationException:   Unable to instantiate fragment  com.netease.caipiao.ssq.tab.ExpertsListFragment: 
  make sure class name exists, is public, and has an empty constructor that is public
 
  复现: 当app启动后,进入异常页面,然后使其进入后台进程(按home键),接着改变系统设置如字体大小等方法,目的上让app被系统杀死后恢复重现,这时候再点击app进入应用,抛出异常。
问题描述:包含有fragment的Activity在异常被销毁(如系统内存不足等)后,再进入恢复activity时,重新实例化fragment时抛出异常出错。 异常的原因就是因为使用的fragment没有public的empty constructor。
查看源代码知:fragment在还原状态中调用FragmentState#instantitae()->Fragment#instantitae()抛出异常。
具体Android源码中抛出的异常代码如下:
   
 /**
     * Create a new instance of a Fragment with the given class name.  This is
     * the same as calling its empty constructor.
     */
    public static Fragment instantiate(Context context, String fname, Bundle args) {
        try {
            Class clazz = sClassMap.get(fname);
            if (clazz == null) {
                // Class not found in the cache, see if it's real, and try to add it
                clazz = context.getClassLoader().loadClass(fname);
                sClassMap.put(fname, clazz);
            }
            Fragment f = (Fragment)clazz.newInstance();
            if (args != null) {
                args.setClassLoader(f.getClass().getClassLoader());
                f.mArguments = args;
            }
            return f;
        } catch (ClassNotFoundException e) 

你可能感兴趣的:(技术文章Android相关,Android,bug,开发,解决方法,fragment)