Android Fragment IllegalStateException: Fragment not attached to Activity

上线的App crash了,收到了QA发来的crash报告,显示Android Fragment IllegalStateException: Fragment not attached to Activity。


从提示信息也比较容易定位,问题是说Fragment not attached to Activity,那么Activity和Fragment是在什么时候detached的呢,从Fragment的生命周期我们可以知道,在OnDestroyView() --> OnDestroy() --> OnDetach(),即在Fragment Destroy的时候会调用OnDetach。在调用了OnDetach了之后,Fragment的状态就改变了。通过fragment的isDetached()方法可以得知当前fragment的状态,在fragment变为detached状态后,再调用getResource()或者getView()等方法,将会报“Fragment not attached to Activity”的错误。


Android Fragment IllegalStateException: Fragment not attached to Activity_第1张图片


在我们的代码中,之所以会出现这个问题,是因为在调用了OnDestroy了之后,仍然在操作Activity或Fragment中的资源更新试图。这种情况比较容易出现在异步网络请求中,即发送网络请求--> 用户等待网络请求 --> 用户退出当前界面 --> 网络请求成功回调 --> 调用getResource()等方法将请求回来的数据更新到试图。在更新试图的时候,由于Fragment已经Detached,将异常。可用的解决办法是,在更新试图的时候,判断一下当前Fragment的状态,如果为Detached的状态,则不更新试图,直接return。

Android Fragment IllegalStateException: Fragment not attached to Activity_第2张图片

如果这种case在整个工程中是一个很普遍的现象,如果需要加判断,将影响到很多的Fragment,一种可用的解决方案是,将Fragment作为请求网络模块的参数传下去,如果在需要回调的时候,判断一下Fragment的状态,如果为非法状态,直接不执行回调。但是此种方法,应该要慎重使用,要防止网络模块拥有Fragment的引用,而造成的Fragment的Memory leak

你可能感兴趣的:(Android Fragment IllegalStateException: Fragment not attached to Activity)