我收到一个NullPointerException,我无法理解为什么会这样。 mainActivityWeakReference.get()似乎返回null。
所以我的猜测是重新创建Activity并且引用变量是 加载类后设置为null,并且只有在调用onCreate方法后才更新引用。但我不明白的是,我正忙于在参考指向的活动中执行指令 然而引用为空。
活动可以在短时间内共存,我该如何处理这种情况。 对我来说,似乎简单的空检查是不够的 处理问题。也许我应该调用finish();
public class MainActivity extends android.support.v7.app.AppCompatActivity {
private WeakReference<AppCompatActivity> mainActivityWeakReference = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
mainActivityWeakReference = new WeakReference<AppCompatActivity>(this);
}
public void handleAction(UserAction userAction) {
switch (userAction) {
case UPDATE_UI:
<< ERROR HERE
mainActivityWeakReference.get().getSupportFragmentManager().executePendingTransactions();
break;
}
}
我的堆栈跟踪:
java.lang.NullPointerException: Attempt to read from field 'android.os.Handler android.support.v4.a.m.a' on a null object reference
at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1476)
at android.support.v4.app.FragmentManagerImpl.executePendingTransactions(FragmentManager.java:490)
at za.co.entersekt.nedbank.MainActivity.handleAction(MainActivity.java:297)
添加了更多细节:
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");
}
答案 0 :(得分:3)
这是因为根据定义a weak reference is a reference that does not protect the referenced object from collection by a garbage collecton
因此,如果您需要活动实例,请尝试执行getActivity()
或getContext()
答案 1 :(得分:0)
我的解决方案是通过钩子方法获取活动:
public class MainFragment extends Fragment implements....
//....
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
activityWeakReference = new WeakReference<>((AppCompatActivity) activity);
}
是的,在那时,活动可以出于几个原因重新创建 弱引用变为null,并且不具有强引用,因此有资格进行垃圾回收。
如果要保留一个强引用,整个活动就没有资格进行垃圾收集,严重的内存泄漏,保留内存的时间更长。
由于以下几个原因,gan会重新创建活动,其中一些原因是: 方向改变,语言改变,甚至当因为某些内存约束而决定执行此操作时。