1

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

换句话说,我有这个结构:

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

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

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

...

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

我的基本活动:

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

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

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 是否不当?

4

1 回答 1

0

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

于 2017-04-13T23:06:43.577 回答