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

Way*_*yne 5 java android android-activity

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

所以我的猜测是重新创建Activity,并且一旦加载了类就将引用变量设置为null,并且只有在调用onCreate方法后才更新引用.但我不明白的是,我忙于在参考指向的活动中执行指令,但引用为空.

活动可以在短时间内共存,我该如何处理这种情况.对我来说,似乎简单的空检查不足以解决问题.也许我应该叫完();

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;
       }
    }
Run Code Online (Sandbox Code Playgroud)

我的堆栈跟踪:

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)
Run Code Online (Sandbox Code Playgroud)

更多细节补充:

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");
        }
Run Code Online (Sandbox Code Playgroud)

war*_*ero 3

这是因为根据定义,a weak reference is a reference that does not protect the referenced object from collection by a garbage collecton
如果您需要一个活动实例,请尝试执行getActivity()getContext()