【问题标题】:Realm in Fragment causing NullPointerException片段中的领域导致 NullPointerException
【发布时间】:2017-09-10 04:23:28
【问题描述】:

当片段的活动扩展控制领域的基本活动时,我对如何在片段中处理领域感到困惑。

换句话说,我有这样的结构:

基础活动 -> 用户活动 -> 基础片段 -> 片段

一切正常,直到我退出活动(即返回上一个活动)。我收到此错误:

java.lang.RuntimeException:无法销毁活动 {UserActivity}: java.lang.NullPointerException:尝试调用虚拟方法'void io.realm.Realm.close()' 在空对象引用上

...

原因:java.lang.NullPointerException:尝试调用虚拟 在空对象引用上的方法“void io.realm.Realm.close()” BaseFragment.onDestroyView

我的基本活动:

public abstract class BaseActivity extends AppCompatActivity {
    private Realm realm;

    protected abstract int getLayoutResource();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(getLayoutResource());

        realm = Realm.getDefaultInstance();
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        realm.close();
    }

    public Realm getRealm() {
        return realm;
    }
}

我的主要活动(创建片段的地方):

public class UserActivity extends BaseActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        String type = getIntent().getStringExtra("type");

        Fragment fragment = null;
        if (findViewById(R.id.fragment_container) != null) {
            if (savedInstanceState != null) {
                return;
            }

            if (type.equals("first")) {
                fragment = new FirstFragment();
            } else if (type.equals("second")) {
                fragment = new SecondFragment();
            }

            getSupportFragmentManager().beginTransaction()
                    .add(R.id.fragment_container, fragment).commit();
        }
    }

    @Override
    protected int getLayoutResource() {
        return R.layout.activity_user;
    }
}

我所有的 Fragment 都扩展了一个基础 Fragment。这是我的基本片段:

public abstract class BaseFragment extends Fragment {

    private Realm realm;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        realm = Realm.getDefaultInstance();

        return inflater.inflate(getFragmentLayout(), container, false);
    }

    @Override
    public void onDestroyView() {
        super.onDestroyView();
        realm.close();
    }

    @Override
    public void onViewCreated(View view, Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);

        realm.executeTransaction(new Realm.Transaction() {
            @Override
                public void execute(Realm realm) {
                    // some realm operation
                }
        });
    }

    protected abstract int getFragmentLayout();
}

导致问题的原因是什么?我是否对 Realm 管理不当?

【问题讨论】:

  • 尝试将 realm.close() 调用放在 super 方法之前?
  • 不幸的是仍然导致 NPE。 ://

标签: java android android-fragments realm realm-java


【解决方案1】:

删除BaseFragment 中的realm.close();,当您销毁活动时将关闭它,因此您将关闭它两次,这就是您获得 NPE 的原因。因此,如果您删除片段中的realm.close();,并让活动处理关闭Realm

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-12
    • 2015-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多