首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >当活动正在执行时,Android weakReference to Activity变为空。

当活动正在执行时,Android weakReference to Activity变为空。
EN

Stack Overflow用户
提问于 2016-02-10 12:03:59
回答 2查看 2.1K关注 0票数 6

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

因此,我的猜测是,一旦加载了类,引用变量就会被重新创建,引用变量将被设置为null,并且只有在调用onCreate方法之后才更新引用。但我不明白的是,我正忙着在引用指向的活动中执行指令,但是引用是空的。

活动能共存片刻吗?我该如何处理这种情况呢?在我看来,一个简单的空检查似乎不足以解决这个问题。也许我应该叫finish();

代码语言:javascript
运行
复制
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;
       }
    }

我的书库痕迹:

代码语言:javascript
运行
复制
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)

添加了更多细节:

代码语言:javascript
运行
复制
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");
        }
EN

回答 2

Stack Overflow用户

发布于 2016-02-10 12:31:09

这是因为根据定义,a weak reference is a reference that does not protect the referenced object from collection by a garbage collecton

因此,如果您需要一个活动实例,请尝试执行getActivity()getContext()

票数 3
EN

Stack Overflow用户

发布于 2017-07-29 11:42:31

我的解决方案是通过钩子方法获得活动:

代码语言:javascript
运行
复制
public class MainFragment extends Fragment implements....
//....

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

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

是的,由于几个原因,活动可以重新创建,此时弱引用变为空,并且不包含强引用,因此有资格进行垃圾收集。

如果要保存一个强引用,那么整个活动就没有资格进行垃圾收集,这是一个严重的内存泄漏,占用内存的时间比它应该保存的时间更长。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35314754

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档