Java 当活动正在执行时,对活动的Android weakReference变为null

Java 当活动正在执行时,对活动的Android weakReference变为null,java,android,android-activity,Java,Android,Android Activity,我得到了一个NullPointerException,我无法理解为什么会发生这种情况。mainActivityWeakReference.get()似乎返回null 所以我猜是活动被重新创建,而引用变量是 加载类后设置为null,并且仅在调用onCreate方法后更新引用。但我不明白的是,我正忙于在引用所指向的活动中执行指令 但引用是空的 活动是否可以暂时共存?我如何处理这种情况。 对我来说,一个简单的空检查似乎不足以 解决这个问题。也许我应该叫finish() 添加了更多详细信息: publi

我得到了一个NullPointerException,我无法理解为什么会发生这种情况。mainActivityWeakReference.get()似乎返回null

所以我猜是活动被重新创建,而引用变量是 加载类后设置为null,并且仅在调用onCreate方法后更新引用。但我不明白的是,我正忙于在引用所指向的活动中执行指令 但引用是空的

活动是否可以暂时共存?我如何处理这种情况。 对我来说,一个简单的空检查似乎不足以 解决这个问题。也许我应该叫finish()

添加了更多详细信息:

public abstract class FragmentManager {
....

public boolean execPendingActions() {
        if (mExecutingActions) {
            throw new IllegalStateException("Recursive entry to executePendingTransactions");
        }

        if (Looper.myLooper() != mActivity.mHandler.getLooper()) {<<FragmentManager.java:1476
            throw new IllegalStateException("Must be called from main thread of process");
        }
公共抽象类碎片管理器{
....
公共布尔执行PendingActions(){
如果(执行动作){
抛出新的非法状态异常(“Recursive entry to executePendingTransactions”);
}

如果(Looper.myLooper()!=mActivity.mHandler.getLooper()){,这是因为根据定义
弱引用是不保护被引用对象不被垃圾收集器收集的引用


因此,如果您需要活动实例,请尝试执行
getActivity()
getContext()
我的解决方案是通过钩子方法获取活动:

public class MainFragment extends Fragment implements....
//....

@Override
public void onAttach(Activity activity) {
    super.onAttach(activity);

    activityWeakReference = new WeakReference<>((AppCompatActivity) activity);
}
public类MainFragment扩展了片段实现。。。。
//....
@凌驾
公共事务主任(活动){
超级转速计(活动);
activityWeakReference=新的WeakReference((AppCompatActivity)活动);
}
是的,在这一点上,活动可以因为几个原因被重新创建 弱引用变为null,并且不包含强引用,因此有资格进行垃圾收集

如果它持有一个强引用,整个活动将不符合垃圾收集的条件,这是一个严重的内存泄漏,占用内存的时间比它应该保留的时间更长

重新创建活动有几个原因,其中一些原因是:
方向改变,语言改变,甚至当android因为内存限制而决定这样做时。

所有这些代码都在一个活动中吗?为什么你对
this
持有一个弱引用?调用
this.getSupportFragmentManager()
太容易了?还有mainActivityWeakReference.get()似乎返回null。而且…mHost为null-正如我之前写的,因为活动处于某种不可用状态。我添加了更多详细信息:(FragmentManager.java:1476)的反编译代码是否不是在主线程上执行的:mainActivityWeakReference.get().getSupportFragmentManager().executePendingTransactions();对此有何想法。为什么会出现NullPointer异常?当我执行语句时,肯定不会对该活动进行垃圾收集。是的,该活动不为null,因为屏幕上有,但弱引用可能会被垃圾收集。请尝试使用getActivity()检查它是否有效我真的认为越来越多的Selvin的评论更加正确。实际的NullPointerException在FragmentManager的第1476行:可能是真的,因为我从未尝试过它,因为它不是真实的场景,我希望它能与getActivity一起工作
public abstract class FragmentManager {
....

public boolean execPendingActions() {
        if (mExecutingActions) {
            throw new IllegalStateException("Recursive entry to executePendingTransactions");
        }

        if (Looper.myLooper() != mActivity.mHandler.getLooper()) {<<FragmentManager.java:1476
            throw new IllegalStateException("Must be called from main thread of process");
        }
public class MainFragment extends Fragment implements....
//....

@Override
public void onAttach(Activity activity) {
    super.onAttach(activity);

    activityWeakReference = new WeakReference<>((AppCompatActivity) activity);
}