FragmentActivity的问题


java.lang.RuntimeException:Unable to start activity ComponentInfo{com.meizu.beautify/com.my.viewc.MainActivity}: android.support.v4.app.Fragment$InstantiationException: Unable to instantiate fragment com.meizu.main.ResourcesDetailedActivity: make sure class name exists, is public, and has an empty constructor that is public

activity Android

藤原妹紅MOE 9 years, 3 months ago

做了这么久的安卓开发,还是会经常遇到这样的问题:自己测试没有问题的APP上线后,总有用户反馈遭遇了bug。但是用户遇到的这些问题,又没有办法在模拟环境中找到对应的日志。那个时候,还不知道腾讯有专门监测Crash的工具bugly,也找不到用户去来配合进行测试,所以每次遇到用户反馈问题,都要搞上好几天。运气不好的时候,几天过去了,仍然找不到问题的根源。

我们的产品历经了若干个版本,这个问题一直没有改善,实在令人抓狂。秉承质量为上的态度,我找到了腾讯的bugly,并在新版产品发布时,就第一时间接入了。产品发布后查看上报记录,还真是不看不知道一看吓一跳。错误日志有几十种,影响用户也不小,于是赶紧一一解决。

举个例子吧:
有个用户反馈很多的问题,由于缺乏堆栈和环境信息,我们一直没有找到问题所在。接入bugly后得知出错行在:

由于只是部分设备出现,在百度与谷歌上也找不到相应的资料,所以我当时一直认为这是安卓自己的bug。

后来接入使用了bugly,上报结果为:
java.lang.NoSuchMethodException
<init> []
java.lang.RuntimeException:Unable to start activity ComponentInfo{com.meizu.beautify/com.my.viewc.MainActivity}: android.support.v4.app.Fragment$InstantiationException: Unable to instantiate fragment com.meizu.main.ResourcesDetailedActivity: make sure class name exists, is public, and has an empty constructor that is public
具体报错日志:
java.lang.NoSuchMethodException:<init> []
java.lang.Class.getConstructor(Class.java:531)
java.lang.Class.getDeclaredConstructor(Class.java:510)
java.lang.Class.newInstance(Class.java:1561)
android.support.v4.app.Fragment.instantiate(Fragment.java:420)
android.support.v4.app.FragmentState.instantiate(Fragment.java:101)
android.support.v4.app.FragmentManagerImpl.restoreAllState(FragmentManager.java:1823)
android.support.v4.app.FragmentActivity.onCreate(FragmentActivity.java:264)
com.my.viewc.MainActivity.onCreate(MainActivity.java:22)
这才发现原来是FragmentActivity的问题。通过Message查阅源码可知,使用Fragment时,不能自己写带参数的构造函数,因为系统默认调用的是无参构造函数 newResourcesDetailedActivity(String cc);

否则在创建Fragment时,系统会调用无参构造函数,而你重新写了带参数的构造函数,导致系统找不到这个方法,最后就出现
java.lang.NoSuchMethodException:<init> []
而且找不到报错的代码行,只要将其改为:newResourcesDetailedActivity();
就不会再出现异常了,然后使用其他的方法传递参数或者对象,问题搞定。

最后非常感谢腾讯的BUGLY,这个工具实在太给力了,绝对是安卓开发中必不可少的一个sdk,现在所有服务都是免费的,在提升产品质量的同时,还降低了产品开发成本。

水野由结的大脸 answered 9 years, 3 months ago

Your Answer