当活动执行时,Android的weakReference to Activity变为null

时间:2016-02-10 12:03:59

标签: java android android-activity

我收到一个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");
        }

2 个答案:

答案 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会重新创建活动,其中一些原因是: 方向改变,语言改变,甚至当因为某些内存约束而决定执行此操作时。