简体   繁体   English

片段领域导致NullPointerException

[英]Realm in Fragment causing NullPointerException

I'm confused as to how to handle Realm in fragments when the fragment's activity extends a base activity that controls Realm. 当片段的活动扩展了控制Realm的基本活动时,我对如何处理片段中的Realm感到困惑。

In other words, I have this structure: 换句话说,我具有以下结构:

Base Activity -> User Activity -> Base Fragment -> Fragment 基础活动->用户活动->基础片段->片段

Everything works fine, until I exit the activity (ie go back to the previous activity). 一切正常,直到我退出活动(即返回上一个活动)。 I get this error: 我收到此错误:

java.lang.RuntimeException: Unable to destroy activity {UserActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'void io.realm.Realm.close()' on a null object reference java.lang.RuntimeException:无法破坏活动{UserActivity}:java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法'void io.realm.Realm.close()'

... ...

Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void io.realm.Realm.close()' on a null object reference at BaseFragment.onDestroyView 原因:java.lang.NullPointerException:尝试在BaseFragment.onDestroyView上的空对象引用上调用虚拟方法'void io.realm.Realm.close()'。

My base Activity: 我的基本活动:

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;
    }
}

My main Activity (where the Fragments are created): 我的主要活动(创建片段的地方):

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;
    }
}

And all of my Fragments extend a base Fragment. 我所有的片段都扩展了基本片段。 Here is my base 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();
}

What's causing the problem? 是什么原因引起的? Am I managing Realm improperly? 我对Realm的管理不当吗?

Get rid of the realm.close(); 摆脱realm.close(); in your BaseFragment that is going to be closed when you destroy the activity, so you are going to be closing it twice, which is why you get the NPE. 在销毁活动时将关闭的BaseFragment中,因此您将关闭两次,这就是获得NPE的原因。 So if you remove the realm.close(); 因此,如果删除realm.close(); in your Fragment, and let the Activity handle closing Realm . 在您的Fragment中,让Activity处理关闭Realm

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM