ReportFragment cannot be cast to ReportFragment

环境

  • Replugin插件框架

问题原因

问题原因的分析这段文字没有经过润色,纯粹是初稿,不一定易于阅读,这段看不下去的同学可以直接看文章最后的解决方案。
ReportFragmentandroid.arch.lifecycle组件中的类,lifecycle组件中的ProcessLifecycleOwnerInitializer继承自ContentProvider,利用ContentProvider#onCreate()方法初始化。

在初始化时,通过Application#registerActivityLifecycleCallbacks()注册Activity的生命周期监听,在onActivityCreated()回调中为每一个Activity注入一个ReportFragment

public static void injectIfNeededIn(Activity activity) {
        // ProcessLifecycleOwner should always correctly work and some activities may not extend
        // FragmentActivity from support lib, so we use framework fragments for activities
        android.app.FragmentManager manager = activity.getFragmentManager();
        if (manager.findFragmentByTag(REPORT_FRAGMENT_TAG) == null) {
            manager.beginTransaction().add(new ReportFragment(), REPORT_FRAGMENT_TAG).commit();
            // Hopefully, we are the first to make a transaction.
            manager.executePendingTransactions();
        }
    }

注入ReportFragment之后,ProcessLifecycleOwner中也会监听Activity的生命周期,并且在onActivityCreated()回调中通过ReportFragment.get()方法获取ReportFragment

static ReportFragment get(Activity activity) {
        return (ReportFragment) activity.getFragmentManager().findFragmentByTag(
                REPORT_FRAGMENT_TAG);
    }

出错的代码就是get()方法中的转型。

ReportFragment为什么不能被转型成ReportFragment呢?因为它们的ClassLoader不同,但是从ReportFragment的注入方法:injectIfNeededIn()和使用方法:get()来看,这两处代码都是ProcessLifecycleOwnerInitializer在初始化时注册的Activity的生命周期监听中回调的。又因为在类A中通过new关键字创建类B,类B的ClassLoader就是类A的ClassLoader,那么这两处代码中的ReportFragment的Classloader应该是同一个,为什么会出现ClassLoader不一致的情况呢?

这就要从FragmentActivity的状态保存说起,来看代码,FragmentActivity#onSaveInstanceState()中,this.mFragments.saveAllState会保存Fragment

protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        this.markFragmentsCreated();
        Parcelable p = this.mFragments.saveAllState();
        if (p != null) {
            outState.putParcelable("android:support:fragments", p);
        }
        ...
        }
    }
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值