我是否必须基于每个线程或每个 usage/class-basis 关闭领域?

Do I have to close realm on a per thread-basis, or per usage/class-basis?

如果我有这样的 MainActivity:

public class MainActivity extends AppCompatActivity
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // Set up database
        RealmConfiguration realmConfiguration = new RealmConfiguration.Builder(this).build();
        Realm.deleteRealm(realmConfiguration); // Clean slate
        Realm.setDefaultConfiguration(realmConfiguration); // Make this Realm the default

        realm = Realm.getDefaultInstance();
    }

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

我在另一个 class(同一个线程)中使用 realm.getDefaultInstance(),如下所示:

public class ViewBookActivity extends Activity {
    private Realm realm;

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_scan_result);

        realm = Realm.getDefaultInstance();
    }
}

然后我应该在 ViewBookActivity 中调用 onDestroy() 中的 realm.close() 吗?或者在 MainActivity 中关闭它是否足够?

领域文档说:

Realm instances are reference counted, which means that if you call getInstance() twice in a thread, you will also have to call close() twice as well.

但我不确定这是否适用于 getDefaultInstance()

此外,即使在其他线程中,如果我在完成写入后将其关闭,是否可以坚持使用 Realm.getDefaultInstance()?我真的不明白 Realm.getInstance(Context context).

的潜在用途

谢谢

最佳做法是,如果您在 onCreate 中打开 Realm,则应在所有活动中的 onDestroy 中再次关闭它,因为这意味着当您的所有活动都关闭时,您的引用计数将达到 0 .所以在你的情况下:是的,你应该在 MainActivityViewBookActivity

中都这样做

关于Realm.getDefaultInstance()。这只是 Realm.getInstance(myConfig) 的 shorthand,因此您还必须调用 close()

Realm.getInstance(Context) 只是 Realm.getInstance(new RealmConfiguration.Builder(context).build()) 的 shorthand,旨在通过小示例让 Realm 入门变得非常容易。如果您打算创建一个更大的应用程序,您应该手动创建您的配置。但我同意它可能会造成混淆,我们或许应该考虑将其全部删除。